淘先锋技术网

首页 1 2 3 4 5 6 7

从零开始搭建Eureka服务注册中心,包含实际应用中服务注册、服务发现、负载均衡等

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();
    }
}