服务发现与消费--Eureka与Ribbon的联手出击

2020-10-27 14:35:16 浏览数 (1)

服务消费者的目标只有两个:发现服务,消费服务。其中服务的发现由Eureka客户端提供,而服务的消费由Ribbon完成。

Ribbon是一个基于Http和Tcp的客户端负载均衡器,他可以在通过客户端配置的ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。当Ribbon与Eureka联合使用时,Ribbon的服务清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。

我们先启动上一节的服务端*2和接口提供端,用于测试注册的服务时候能够使用,以及负载均衡。

然后另外新建一个消费端,消费端除了普通的springboot项目需要的依赖,还要在pom文件加入以下内容

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 这里为了监察运行情况,我加入了下面这个引用,如果不需要监察可以不加-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

下面是消费方的application.java代码:

代码语言:javascript复制

@EnableDiscoveryClient
@SpringBootApplication
public class BlogApplication {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(BlogApplication.class, args);
    }
}

可以看出来和服务提供方的差别并不是特别大。

其中@LocalBalanced可以提供负载均衡

(https://blog.csdn.net/xiao_jun_0820/article/details/78917215)

消费方的restful api如下:

代码语言:javascript复制
@RestController
public class ConsumerController{
    private final Logger logger = Logger.getLogger("ConsumerController");
    
    @Autowired
    private RestTemplate restTemplate;
    
    @RequestMapping("/ribbon-consumer")
    public String helloConsumer(@RequestParam String name){
        logger.info("进入了方法");
        return restTemplate.getForEntity("http://EUREKA-CLIENT/hello?name="   name,String.class).getBody();
    }
}

这里为了增加互动性,我将之前的eureka-client的hello接口修改了以下

代码语言:javascript复制
@RequestMapping("/hello")
  public String index(@RequestParam String name) {
    ServiceInstance instance = client.getInstances(registration.getServiceId()).get(0);
    logger.info("/hello,host: "   instance.getHost()   " , service_id: "   instance.getServiceId());
    return "Hello "   name   "!";
  }

至此,访问我们的消费者api的链接http://localhost:8081/ribbon-consumer?name=JathonKatu

可以看到结果

可以观察提供接口的类此时的日志:

代码语言:javascript复制
2020-04-12 19:24:28.871  INFO 23240 --- [io-8080-exec-10] HelloController                          : /hello,host: DESKTOP-VVVH0SM , service_id: EUREKA-CLIENT
2020-04-12 19:29:06.633  INFO 23240 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

说明我们的服务已经通过平台调通了。

并且,我将服务提供方放在peer1的Eureka服务器上,将服务的消费方放在peer2的Eureka服务器上,通过两台服务器的高可用互相备份,最终访问通过,和网上说的必须放在同一Eureka服务器上个并不一致。

0 人点赞