服务发现与消费--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服务器上个并不一致。
- 分布式计算,WCF+JSON+实体对象与WebService+DataSet效率大比拼
- 【自然框架】 页面里的父类—— 改进和想法、解释
- 线性神经网络
- 【数据可视化】深度解析大数据可视化设计案例分析
- 使用IE6看老赵的博客——比较完美版(可以在线查看、回复)
- 【Python环境】R vs Python:硬碰硬的数据分析
- 使用IE6看老赵的博客——jQuery初探
- matlab GUI基础8
- 见到了“公司”定义一个Company类,那么见到了“字段”是不是也可定义一个Column类?
- 再论桥接模式(上)纸上谈兵
- 反馈型神经网络
- 竞争型神经网络续1
- 径向基神经网络续1
- "开门待客"还是“送货上门”?
- 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 数组属性和方法
- miRBase物种名缩写
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- 在R语言中使用航空公司复杂网络对疫情进行建模
- R语言用关联规则和聚类模型挖掘处方数据探索药物配伍中的规律
- ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
- ggalluvial|炫酷桑基图(Sankey),你也可以秀
- R|批量循环处理同一格式文件-csv,txt,excel
- 误差线怎么画,写不写代码as you like
- Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化
- Forest plot(森林图) | Cox生存分析可视化
- R-forestplot包| HR结果绘制森林图
- 韦恩图
- R-plotly|交互式甘特图(Gantt chart)-项目管理/学习计划
- Python的这些高级用法你都知道吗?
- ggstatsplot绘图|统计+可视化,学术科研神器