概述
在之前的文章中, 我们发现了我们写死了获取服务的地址, 这样导致了如果我们修改了服务部署服务器, 以及部署多个避免单点故障的时候, 直接写死非常的不便。
由此, 我们需要一个来专门管理这些服务地址的工具, 那就是eureka, 实现了服务注册和状态监控等等。
现在有了3个角色:
-
eureka: 服务的注册, 提供服务的地址, 状态监控
-
服务提供者: 向eureka注册自己的服务
-
服务消费方: 向eureka获取想要的服务
搭建eureka-server服务
- maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 启动器
注意要添加 @EnableEurekaServer的注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 配置文件
server:
port: 10086
spring:
application:
name: eureka-server-main
eureka:
client:
service-url:
# eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
defaultZone: http://127.0.0.1:10086/eureka
# 是否注册自己
register-with-eureka: false
# 不拉取服务
fetch-registry: false
- 启动运行
访问 http://127.0.0.1:10086/ 就能见到eureka的服务详情页面
改造user-service
- 添加maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改启动引导类
在启动引导类上添加 @EnableDiscoveryClient 注解
// 开启eureka客户端发现
@EnableDiscoveryClient
- 修改配置文件
# 配置服务名
spring:
application:
name: user-service
# 配置eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 启动注册
发现了服务已经注册到了eureka中了
改造user-comsumer
- maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置启动引导类
// 开启eureka客户端发现
@EnableDiscoveryClient
- 修改配置文件
# 配置服务名
spring:
application:
name: user-consumer
# 配置eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 修改controller获取服务的方式
之前是直接写死的url地址
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/{id}")
public User queryById(@PathVariable Integer id){
ServiceInstance userService = discoveryClient.getInstances("user-service").get(0);
User user = restTemplate.getForObject("http://"+userService.getHost()+":"+userService.getPort()+"/user/" + id, User.class);
return user;
}
- 启动测试
访问 http://127.0.0.1:8081/user/1
- 访问报错
原因: DESKTOP-D0RE3JN:user-service:8080, 使用的是主机用户名, 我们更希望使用ip, 修改user-service 和user-consumer配置, 添加ip地址优先使用, 再次启动, ok
eureka:
instance:
prefer-ip-address: true
下面代码中此配置有点问题, 大家注意下, 配置成了(instance应该是在eureka下, 和client同一层, 下面是错误的)
eureka:
client:
instance:
prefer-ip-address: true
eureka的高可用
启动多个eureka, 即使挂掉1台, 依然有可用的eureka, 那么就需要启动多台eureka ,并且他们能够同步注册过来的服务(即互相注册)
- 配置文件
server:
port: ${port:10086}
spring:
application:
name: eureka-server-main
# eureka单节点配置-*-*-*-start
#eureka:
# client:
# service-url:
# # eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
# defaultZone: http://127.0.0.1:10086/eureka
# # 是否注册自己
# register-with-eureka: false
# # 不拉取服务
# fetch-registry: false
# eureka单节点配置-*-*-*-end
# eureka集群配置-*-*-*-start
eureka:
client:
service-url:
# eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
defaultZone: ${defaultZone:http://127.0.0.1:10086/eureka}
# 是否注册自己
register-with-eureka: true
# 不拉取服务
fetch-registry: true
# eureka集群配配置-*-*-*-end
- 根据不同参数启动多个
第一台修改
第二台修改
第一台运行会报错, 因为第二台还没有启动, 服务向第二台注册会失败, 启动是正常的。
eureka的其他配置
配置eureka客户端user-service的注册、续约等配置项,配置eureka客户端user-consumer的获取服务间隔时间;了解失效剔除和自我保护
-
Eureka客户端工程
- user-service 服务提供
- 服务地址使用ip方式
- 续约
- consumer-demo 服务消费
- 获取服务地址的频率
- user-service 服务提供
-
Eureka服务端工程 eureka-server
- 失效剔除
- 自我保护
-
user-service
# 配置eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
# 配置ip
ip-address: 127.0.0.1
# 优先使用ip
prefer-ip-address: true
# 一旦超过多长时间, eureka认为服务已经移除或者失效, 默认: 90s
lease-expiration-duration-in-seconds: 30
# 服务的续约时间(多久续约一次) 默认:30s
lease-renewal-interval-in-seconds: 10
- user-comsumer
# 配置eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
# 拉取服务的时间间隔, 默认: 30s
registry-fetch-interval-seconds: 10
instance:
prefer-ip-address: true
- eureka-server
eureka出现红色告警, 是因为开启了自我保护, eureka不会应为服务突然失联而去提出服务, 而在实际中, 自我保护意义不大。
eureka:
client:
service-url:
# eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
defaultZone: http://127.0.0.1:10086/eureka
# 是否注册自己
register-with-eureka: false
# 不拉取服务
fetch-registry: false
server:
# 服务失效剔除时间间隔, 默认60s
eviction-interval-timer-in-ms: 10000
# 关闭自我保护模式(默认:开启)
enable-self-preservation: false