一、Eureka简介
Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一。用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
简而言之,就是服务的注册与发现,类似于 Dubbo 的注册中心,比如 Zookeeper。
二、Eureka创建注册中心(注册中心)
1.创建Spring Boot 项目 eureka-register-service
可以手动创建,也可以快捷生成SpringBoot项目:https://start.spring.io/
2.pom.xml中添加依赖( 依赖可到http://mvnrepository.com/中自行查找 )
<!-- Eureka服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.新建配置文件application.yml,配置相关参数
server:
port: 9000
eureka:
instance:
hostname: localhost # eureka 实例名称
client:
register-with-eureka: false # 不向注册中心注册自己
fetch-registry: false # 是否检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心访问地址
4.启动类添加注解@EnableEurekaServer,开启注册中心功能
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApplication.class, args);
}
}
5.访问 http://localhost:9000 ,查看 Eureka 服务监控界面
由于此时还没有服务注册,因此没有服务信息 No instances available。
三、Eureka注册服务(服务提供)
1.创建Spring Boot 项目 eureka-provider
2.pom.xml中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3. 新建配置文件application.yml,配置相关参数
server:
port: 8081
spring:
application:
name: eureka_provider
eureka:
instance:
instance-id: eureka_provider-8081
prefer-ip-address: true # 访问路径可以显示 IP
client:
service-url:
defaultZone: http://localhost:9000/eureka/ # 注册中心访问地址
4.提供接口供消费者端调用,业务逻辑在此实现
@RestController
@RequestMapping("/provider/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get/{id}")
public User get(@PathVariable("id") Integer id) {
return this.userService.getById(id);
}
}
5.启动类添加注解@EnableEurekaClient(注意跟@EnableEurekaServer的区别)
@EnableEurekaClient
@SpringBootApplication
public class SpringCloudProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudProviderApplication.class, args);
}
}
6. 仍然访问 http://localhost:9000 ,查看 Eureka 服务监控界面
此时有服务注册进来,不再显示No instances available,应用名自动显示为大写。
四、Eureka发现服务(服务消费)
1.创建Spring Boot 项目 eureka-consumer
2.pom.xml中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3.新建配置文件application.yml,配置相关参数
server:
port: 80
spring:
application:
name: eureka_consumer
eureka:
client:
register-with-eureka: false # 不向注册中心注册自己
fetch-registry: true # 是否检索服务
service-url:
defaultZone: http://localhost:9000/eureka/ # 注册中心访问地址
4.业务相关类 获取注册的服务(调用eureka_provider中接口)
public class User{
private int id;
private String userName;
private String password;
public User() {
super();
}
public User(int id, String userName, String password) {
super();
this.id = id;
this.userName = userName;
this.password = password;
}
//get set 方法略
}
@RestController
@RequestMapping("/user")
public class UserController {
private static final Log log = LogFactory.getLog(UserController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient client;
@RequestMapping("get/{id}")
public User get(@PathVariable("id") Integer id) throws Exception {
List<ServiceInstance> list = this.client.getInstances("EUREKA_PROVIDER");
String uri = "";
for (ServiceInstance instance : list) {
if (instance.getUri() != null && !"".equals(instance.getUri())) {
uri = instance.getUri().toString();
break;
}
}
log.info("获取到的服务uri = " + uri);
return restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class);
}
}
5.启动类添加注解@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudConsumerApplication {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
}
6.访问地址http://localhost/user/get/1,查看调用服务接口结果
五、注意事项
1.pom.xml中添加依赖时,注意Spring Cloud与Spring Boot版本匹配关系
Spring Cloud | Spring Boot |
---|---|
Finchley | 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x |
Dalston和Edgware | 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x |
Camden | 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x |
Brixton | 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x |
Angel | 兼容Spring Boot 1.2.x |
2.如果开发工具是eclipse,那么要注意application.yml配置文件不要用Tab键来缩进,因为会导致spring读取yml配置文件异常。老老实实的按空格好了。
3.直接注入RestTemplate没用,需要RestTemplateBuilder构建。
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
4.restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class);注意User中一定要有无参构造,否则会报错如下:
5.@EnableEurekaClient & @EnableDiscoveryClient
两者用法基本一致,都用来服务发现。
如果注册中心是eureka,推荐使用@EnableEurekaClient,如果是其他注册中心,则推荐使用@EnableDiscoveryClient。