服务发现与消费--Eureka与Ribbon的联手出击
服务消费者的目标只有两个:发现服务,消费服务。其中服务的发现由Eureka客户端提供,而服务的消费由Ribbon完成。
Ribbon是一个基于Http和Tcp的客户端负载均衡器,他可以在通过客户端配置的ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。当Ribbon与Eureka联合使用时,Ribbon的服务清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。
我们先启动上一节的服务端*2和接口提供端,用于测试注册的服务时候能够使用,以及负载均衡。
然后另外新建一个消费端,消费端除了普通的springboot项目需要的依赖,还要在pom文件加入以下内容
<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代码:
@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如下:
@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接口修改了以下
@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
可以看到结果
可以观察提供接口的类此时的日志:
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服务器上个并不一致。
- 左手用R右手Python系列之——数据框与apply向量运算
- 左手用R右手Python系列之——迭代器与迭代对象
- 【关关的刷题日记61】Leetcode 102. Binary Tree Level Order Traversal
- 【关关的刷题日记62】Leetcode 104. Maximum Depth of Binary Tree
- DataAnnotations - InverseProperty Attribute:
- 【关关的刷题日记63】Leetcode 111 Minimum Depth of Binary Tree
- Configure Many-to-Many relationship:
- 【关关的刷题日记64】Leetcode 110 Balanced Binary Tree
- 左手用R右手Python系列之——json序列化与反序列化
- 【干货】GAN调研:多极扩展(跨域和条件的GAN扩展模型调研)
- 【干货】TensorFlow实战——图像分类神经网络模型
- HTML5手机APP开发入(5)
- 这种自带黑科技的R包,请给我来一打
- 4927 线段树练习5
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android studio 3.0 service项目背景音乐实现
- 疯子的算法总结(六) 复杂排序算法 ① 归并排序 merge_sort()
- PostgreSQL扫描方法综述
- CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
- XLOG段文件跳号现象分析
- codeforce 227E 矩阵快速幂求斐波那契+N个连续数求最大公约数+斐波那契数列的性质
- 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
- POJ3614防晒霜 这个贪心有点东西(贪心+优先队列)
- 环形均分纸牌问题(中位数)
- POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)
- P1522 牛的旅行 Cow Tours(floyd)
- P1468 派对灯 Party Lamps(BIG 模拟)
- 【JVM系统学习之路系列】 JVM 概述篇
- P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)