1.1. 一、注册中心服务端。
1.1.1. 新建一个Eureka服务注册中心。
和创建springboot项目一样,创建一个springboot项目项目。如下图:
只需要把Eureka Server
选上,把依赖加入即可。
1.1.2. 分析pom文件。
创建好项目之后,pom.xml文件中比普通的springboot项目,多了4个:
- spring-cloud的版本管理。
<properties> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties>
- spring-cloud依赖管理。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 从spring-cloud中加入eureka-server。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
添加仓库。
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories>
所以普通的springboot项目,想改造为eureka注册中心。只要加上上面的配置即可。
1.1.3. 启用注册中心。
使用
@EnableEurekaServer
启用注册中心。
```java @SpringBootApplication @EnableEurekaServer public class EurekaRegisterCenterApplication {public static void main(String[] args) {
SpringApplication.run(EurekaRegisterCenterApplication.class, args);
}
}
### 配置注册中心。
`application.yml` 中配置如下:
```yaml
server:
# tomcat 服务端口
port: 9999
eureka:
client:
#使用@EnableEurekaServer后,默认会把自己作为一个客户端和服务注册中心。把自己注册到“注册中心”。
#值为false意味着自身仅作为服务器,不作为客户端
register-with-eureka: false
#值为false意味着无需注册自身
fetch-registry: false
# 注册中心的地址,注册中心监控页面上会用到
service-url:
defaultZone: http://localhost:${server.port}/eureka/
#logging.level.com.netflix.eureka=OFF
#logging.level.com.netflix.discovery=OFF
spring:
application:
name: my-eureka-register-center
1.2. 二、搭建普通微服务,注册到注册中心。
1.2.1. 加入依赖
新建一个简单的springboot服务,加入eureka-client
依赖。
<properties>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2.2. 启用客户端
之前的版本需要使用 @EnableDiscoveryClient
启用eureka,把这个服务向eureka注册。现在不需要这个。
//之前的版本需要 @EnableDiscoveryClient
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
1.2.3. 配置微服务
server:
port: 9090
spring:
application:
name: user-consumer
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/user-consumer?serverTimezone=GMT%2b8
username: root
password: 123456
eureka:
client:
serviceUrl:
# 注册中心的地址
defaultZone: http://localhost:9999/eureka/
1.2.4. 添加测试代码。
@RestController
public class UserController {
@GetMapping("/hello")
public String sayHello() {
return "hello from user_provider";
}
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/service-instances/{applicationName}")
public List<ServiceInstance> serviceInstancesByApplicationName(
@PathVariable String applicationName) {
return this.discoveryClient.getInstances(applicationName);
}
}
1.3. 三、测试效果。
1.3.1. 查看注册中心
分别启动注册中心eureka-register-center
,微服务user-consumer
。
访问注册中心http://localhost:9999/
可以看到效果如下:user-consumer
服务注册到了eureka 注册中心上了。
1.3.2. 访问服务。
可以看到Status
下面的服务实例KXPIR1TCDAFMGVY:user-consumer:9090
,
其中KXPIR1TCDAFMGVY
是hostname就是我的主机名字。如下:
如果要请求/hello
有2种方式:
- 通过注册中心实例id访问。请求
http://kxpir1tcdafmgvy:9090/hello
就是通过注册中心访问。 - 直接访问。请求
http://localhost:9090/hello
。1.3.3. 同一个服务运行多个实例
改一下user-consumer
服务的端口,再启动一个user-consumer
服务。可以看到eureka中注册了2个user-consumer
服务的实例。
可以看出各个服务注册到eureka,是以spring.application.name
区分是不是同一个服务的。
1.4. 四、使用IP地址调用服务。
eureka的client注册到server时默认是使用hostname而不是ip,例如上面的KXPIR1TCDAFMGVY:user-consumer:9090
。这就导致client在多台机器时,服务间相互调用时也会使用hostname进行调用,从而调用失败。
这时候就需要使用ip来服务到eureka-server上,需要在eureka的client增加配置如下:
eureka.instance.preferIpAddress=true
eureka.instance.instanceId=${spring.cloud.client.ip-address}:${server.port}
- client端设置
eureka.instance.preferIpAddress=true
如图所示,Status
下面服务的连接地址会改变为ip+端口
。原来是主机名+端口
。 - client端设置
eureka.instance.instanceId=${spring.cloud.client.ip-address}:${server.port}
如图所示,把Status
下面服务的显示改为ip+端口
。 这里版本不同还有些不一样。 springcloud2.0之前是${spring.cloud.client.ipAddress}
1.5. 参考文档:
https://mp.weixin.qq.com/s/4-JLI3QvwFQgJ_gEFI_51w
http://www.itmuch.com/spring-cloud/finchley-5/
http://blog.didispace.com/spring-cloud-starter-dalston-1/