Eureka与Ribbon是为了解决什么问题?
Eureka是为了解决什么问题?
我们通过RestTemplate就可以实现服务远程调用,但存在一些问题?
- 在consumer中,我们把url地址硬编码到代码中不方便后期维护
- consumer需要记忆user-service的地址,如果出现变更,可能得不到通知,地址将失效
- consumer不清楚user-service的状态,服务宕(dang)机
- user-service只有1台服务器,不具备高可用
- 即便user-service形成集群,consumer还需要自己实现负载均衡
概括一下分布式服务必然需要面临的问题:
- 服务管理
- 如何自动注册和发现
- 如何实现状态监管
- 如何实现动态路由
- 服务如何实现负载均衡
- 服务如何解决容灾问题
而Eureka就是实现了服务的自动注册、发现、状态监控
原理图:
- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
server
server:
port: 10086
spring:
application:
name: eureka-server #应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
client:
service-url: #EurekaServer的地址,现在是自己的地址,如果是集群,需要写其他server的地址
defaultZone: http://127.0.0.1:10086/eureka
register-with-eureka: false #不注册自己
fetch-registry: false #不拉取
client
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
Ribbon是为了解决负载均衡
由于Eureka中已经集成了Ribbon,所以无需引入新的依赖。直接在RestTemplate的配置方法上添加LoadBanced注解
@Bean
@LoadBalanecd
public RestTemplate restTemplate(){
return new RestTemplate();
}