前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud学习(3)——服务发现与消费以及客户端负载均衡Ribbon

Spring Cloud学习(3)——服务发现与消费以及客户端负载均衡Ribbon

作者头像
胡了了
发布2019-05-29 15:50:11
7710
发布2019-05-29 15:50:11
举报

阅读的书籍为《Spring Cloud 微服务实战》。

《Spring Cloud学习(2)——高可用Eureka Server》中,我搭了一个双节点的服务注册中心集群。

同时在《Spring Cloud学习(1)——单节点Eureka Server》中,创建了一个名为hello-world-service的服务提供者。

这里,为了测试Ribbon的客户端负载均衡功能,需要启动hello-world-service服务的两个实例。

实例名配置

在eureka中,实例名,即InstanceInfo中的instanceId,它是区分同一服务中不同实例的唯一标识。

在Netflix Eureka的原生实现中,实例名采用主机名作为默认值,这样的配置使得在同一主机上无法启动多个相同的服务实例。

而在Spring Cloud Eureka中,针对这一情况,对实例名的默认值做了更为合理的扩展,规则如下:

代码语言:javascript
复制
${spring.cloud.client.hostname}:${spring.application.name}:{spring.application.instance_id:${server.port}}

对于实例名的命名规则可以通过eureka.instance.instanceId参数来配置。

例如,在同一台机器上需要启动同一服务的多个实例,如果直接启动同一个应用,必然会产生端口冲突。 可以设置:

代码语言:javascript
复制
eureka.instance.instanceId=${spring.application.name}:${random.int}

修改hello-world-service服务application.properties,修改如下:

代码语言:javascript
复制
spring.application.name=hello-world-service
server.port=0
eureka.instance.instanceId=${spring.application.name}:${random.int}
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

通过java -jar命令行的方式启动两个实例:

代码语言:javascript
复制
java -jar helloworld-0.0.1-SNAPSHOT.jar
这里写图片描述
这里写图片描述

创建服务消费者

  • 使用IDEA搭建一个基础的Spring Boot工程作为服务消费者,起名ribbon-demo,在pom.xml中引入必要的依赖内容。

相较之前的hello-world-service,需要新增Ribbon模块的依赖spring-cloud-starter-ribbon。

  • 主类中加上@EnableDiscoveryClient注解,同时创建RestTemplate的Spring Bean实例,并通过@LoadBalanced注解开启客户端的负载均衡。
代码语言:javascript
复制
package com.example.ribbondemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class RibbonDemoApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonDemoApplication.class, args);
    }
}
  • 在该工程的主类同级目录下创建一个RESTful API实现代码。通过上面创建的RestTemplate来访问HELLO-WORLD-SERVICE服务提供的/helloworld接口。
代码语言:javascript
复制
package com.example.ribbondemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/ribbon-test", method = RequestMethod.GET)
    public String ribbonTest() {
        return restTemplate.getForEntity("http://HELLO-WORLD-SERVICE/helloworld",String.class).getBody();
    }
}
  • 在application.properties中增加如下配置:
代码语言:javascript
复制
spring.application.name=ribbon-demo
server.port=9000
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
  • 启动服务

测试

  • 启动上文的ribbon-demo服务。
  • 在eureka的信息面板中,可以看见多了RIBBON-DEMO服务。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

观察启动的两个HELLO-WORLD-SERVICE服务控制台,可以看出,有一个控制台响应了RIBBON-DEMO服务的调用。

观察启动的两个HELLO-WORLD-SERVICE服务控制台,可以看出,两个实例交替响应RIBBON-DEMO服务的调用。

这里写代码片
这里写代码片
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年03月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实例名配置
  • 创建服务消费者
  • 测试
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档