从零开始搭建Eureka服务注册中心,包含实际应用中服务注册、服务发现、负载均衡等
代码地址:https://gitee.com/webprogram/springcloud_learn
Eureka的作用
Eureka是spring cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)P(分区容错性)
消费者如何获取服务提供者信息?
* 服务提供者在启动时项Eureka注册自己的信息
* Eureka保存这些信息
* 消费者根据服务名项Eureka拉取服务提供者信息
多个服务提供者,消费者如何选择?
消费者利用负载均衡算法,从服务列表选一个
消费者如何感知提供者健康状态?
*服务提供者会每30S向Eureka发送心跳请求,报告状态
*Eureka会更新服务列表信息,心跳不正常会被剔除
*消费者拉取最新提供者信息,则不会请求到不正常的服务
Eureka实践
搭建注册中心
搭建EurekaServer
Eureka-Server不是服务注册嘛,为什么也要写地址
Eureka-Server本身也是一个服务,会把自己也注册进去,将来做注册中心集群时会互相通信
搭建过程问题收集
*子模块依赖引入问题:https://blog.csdn.net/qq_38668544/article/details/120003105?spm=1001.2014.3001.5501
服务注册
将服务提供者注册到Eureka
注册自定义服务
上图中:service-url为注册中心地址
IDEA中多实例部署 -Dserver.port=XXXX
如上图所示:已启动8081、8083两个userservice服务
服务发现
服务消费者拉取提供者信息,通过负载均衡挑选服务,实现远程调用
如何调用服务
调用接口地址为:http://服务名/XXX
XXX:具体调用服务接口地址
实例代码
// 订单服务需要查询用户信息
// 注: url构成 服务名+详细接口地址
@RequestMapping("/{id}")
public OrderEntity getOrder(@PathVariable String id){
OrderEntity order = queryOrder(id);
String url = "http://userservice/user/" + order.getUserId();
UserEntity userEntity = restTemplate.getForObject(url,UserEntity.class);
order.setUser(userEntity);
return order;
}
// userservice为用户服务在注册中心注册的服务名
// 用户服务接口
@RestController
@RequestMapping("user")
public class UserController {
@RequestMapping("/{id}")
public UserEntity getOrder(@PathVariable String id){
return queryUser(id);
}
}
实现负载均衡
// 订单服务需要调用用户服务的多个实例(8081、8083)
// RestTemplate 注入spring容器中
// 添加注解 @LoadBalanced 实现负载均衡
@EnableEurekaClient
@SpringBootApplication
public class OrderServiceApplication{
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class);
}
@Bean
@LoadBalanced // 负载均衡
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
}