实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例

转载自  实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例

Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一。通过Eureka可以提供服务注册、发现、负载均衡、降级、熔断等功能。本篇主要介绍Eureka作为服务注册中心,以及实现一个基本的负载均衡服务。

1. 为什么需要Eureka

对于一个大型系统来说,不可避免的会存在各种子系统之间的调用关系,比如一个子系统A请求子系统B的服务:

与此同时随着用户量的增加,或者服务本身的迭代,会加入更多的调用关系:

如上图所示,子系统间的调用关系会随着项目迭代变得异常复杂,任何一个项目的改动,都会牵连好几个项目跟着重启。如果服务提供方(B、D)的IP变动,调用方就要重启以应对这种变化。

Eureka提供了一种服务注册及发现的服务,当引入服务注册后,你的项目架构可变为:

通过服务注册中心,任何子系统就不再需要关注服务提供方的IP地址等信息,直接向服务中心请求调用即可。另外,Eureka也提供了负载均衡、监控节点、熔断机制去除故障节点等功能。因此,对于分布式应用来说,Eureka可以发挥很大的作用。

2. 关于Eureka

根据第一小节的分析,我们可以把基于Eureka的架构归纳为如下图:

可以看到包含Eureka框架中主要包括三个实体:Eureka Server、Client、Producer。

  • Eureka Server,服务注册和发现,统一管理各种服务。

  • Client,消费者,面向客户,服务的调用方。

  • Producer,服务生产者,服务的被调用方。

3. 关于Ribbon

Spring Cloud Ribbon也是Netflix公司开源的组件之一,主要提供了客户端的负载均衡服务,可配合Eureka一起使用。Ribbon客户端提供了一系列完善的配置选项,包括服务链接超时、重试机制等。Ribbon内置可插拔、可定制的负载均衡策略,包括:

  • 简单轮询策略

  • 加权响应时间

  • 区域感知

  • 随机负载

4. 关于Feign

Feign是Netflix公司出品的声明式Web服务调用端,我们只要创建接口并用它来调用已存在的接口即可。同时它还整合了Ribbon和Rureka来提供负载均衡的REST请求实现。以本文为例,客户端CLient编写一个Feign请求:

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;/*** Created by zhaoyh on 2018/1/03* @author zhaoyh*/
@FeignClient(name = "PRODUCER")
public interface FeignService {@RequestMapping(value = "/api/calculate")String calculate(@RequestParam(value = "num") int num);
}

如果想要使用该接口,可以以如下的方式:

@Autowired
private FeignService feignService;
@RequestMapping(value = "/requestByFeign/{num}", method = RequestMethod.GET)
public String requestByFeign(@PathVariable(value = "num") int num) {String result = feignService.calculate(num);return result;
}

关于Ribbon和Feign,我个人是这样理解的:Ribbon是一个客户端的负载均衡器;Feign更像是一个Http客户端,用来请求Web接口服务。

5. 负载均衡案例实现

本案例就基于Eureka注册中心,做一个简单的具备服务注册发现和负载均衡的应用。

案例需要你的主机配置如下环境:

软件版本
JDK1.8
Maven2.0+

对于在第二节中介绍的三个实体,我们基于Spring Boot建立了三个对应的项目,都已push到github上了,可以直接点击对应的项目clone下来。

github-Eureka Server

github-Client

github-Producer

5.1 案例说明

实现一个简单的远程调用,计算斐波那契数列的值并返回。

  • Client端:面向用户,用户查询斐波那契的结果。

  • Producer端:提供计算结果。

  • Eureka Server:提供服务注册。

5.2 启动Eureka Server

cd springboot-eureka-server
./mvnw.sh clean install
java -jar target/springboot-eureka-server-0.0.1.jar

然后打开浏览器,输入 http://localhost:1111 ,此时没有任何服务注册进来,初始界面如下:

5.3 启动Producer

为了达到负载均衡的效果,接下来我们就要启动多个Producer的实例,首先:

cd springboot-loadbalance-server

修改applications.properties中port的值,每设置一个端口号,则打包一次:

./mvnw.sh clean install
保存 target/springboot-loadbalance-server-0.0.1.jar 到任意位置并执行。

我启动了三个实例,分别是9092、9093、9094端口。重启后,在http://localhost:1111中查看Eureka Server已收到我注册的三个服务:

5.4 启动Client

cd springboot-loadbalance-client
./mvnw.sh clean install
java -jar target/springboot-loadbalance-client-0.0.1.jar

此时再打开注册中心就会发现该客户端也已经注册成功了:

接下来就是要验证请求服务啦,Client的端口号是9090。在客户端的controller里,我实现了两种请求方式,第一种是RestTemplate,这是Spring提供的一种请求restful接口的便捷模版;第二种是Neitflix公司的Feign。

使用RestTemplate模版的访问链接 http://localhost:9090/requestByRestTemplate/10 ;使用Feign的访问链接 http://localhost:9090/requestByFeign/10 。

由于我们默认采用轮询的负载均衡策略,多刷新几次,会看到不同的实例依次返回计算结果:

至此我们的服务注册和简单轮询负载均衡就实现完了,有兴趣的小伙伴可以直接从上文所述的github上把代码star并clone下来体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开发一个laravel项目的增删改查、详情

环境要求: wampcomposer 创建laravel项目: composer create-project --prefer-dist laravel/laravel person快速完成person注册登录开发 1、migration php artisan make:migration create_people_table$table->increments(id);$table->string…

使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用

本文翻译自Scott Hanselman博客:https://www.hanselman.com/blog/WritingSmarterCrossplatformNETCoreAppsWithTheAPIAnalyzerAndWindowsCompatibilityPack.aspx正文:这是最近这几周你应该知道的一对.Net Core界的优秀工具。我们在编写或者移植跨平台代码…

实验进行中:.NET WebAssembly支持

目前四大主流浏览器都默认支持WebAssembly,而.NET社区也在继续推动为.NET开发者提供相关能力,来将他们的代码编译成WebAssembly,然后在浏览器上运行。WebAssembly是一种二进制web格式,旨在以接近原生的性能运行不是用JavaScript语…

Js对象如何添加方法、查看Api

js万物皆对象,要带着观察对象的眼观去看待每一个函数、变量。 为什么要用到原型? Es6以前,js中没有如ooa编程当中的class,但是要用到类,怎么办呢,构造函数就应运而生,但是构造函数里面添加方法…

微软人工智能和对话平台--知识商城体验

前言微软最新发布 知识商城了!这是一个人工智能和对话平台应用的场景。他可以让开发者带着想法 出做天马行空的创造性工作!你只需要稍微动动手,如:拖拽板块,就可以做到极致对答、代码自动生成!想象一下&…

Spring @Import注解配置类方法内部调用没有注入属性值的坑

一、场景复现 application.yaml spring:application:name: config-testprofiles:active: devconfig:config-01:name: zhansancode: 001config-02:name: lisicode: 002导入配置类 Configuration Import(ImportConfig.class) public class Config {BeanConfigurationPropertie…

使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)

如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购…

Spring Boot 数据库连接池入门

转载自 芋道 Spring Boot 数据库连接池入门 本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-19 目录。 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在我们的项目中,数据库连接池基…

.net core 实现简单爬虫—抓取博客园的博文列表

一.介绍一个Http请求框架HttpCode.CoreHttpCode.Core 源自于HttpCode(传送门),不同的是 HttpCode.Core是基于.net standard 2.0实现的,移除了HttpCode与windows相耦合的api,且修改了异步实现,其余特性完全与…

SpringBoot2.1.9 Mybatis由于@Mapper注解多数据源配置不生效问题

一、场景复现 (1)项目 目录 配置文件 spring:application:name: multi-datasourceprofiles:active: dev1datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?…

使用Windows兼容包简化向.NET Core的迁移

从.NET迁移到.NET Core的一个主要原因,在于后者具备在Linux上运行的能力。但是对于大型企业应用,不可能实现一步迁移到位。由此,Microsoft推荐采用一种逐步迁移做法:第一步,迁移到ASP.NET Core(依然使用.NE…

springboot使用xml配置mybatis

前面用注解配置了mybatis&#xff0c;非常的简单&#xff0c;但是在写动态sql语句的时候会非常的麻烦&#xff0c;所以这边我们用xml来重新配置一下 在resource目录下新建 SqlMapConfig.xml 主配置文件 <?xml version"1.0" encoding"UTF-8" ?> &…

SpringBoot2.1.9 Mybatis多数据源配置

一、配置文件 目录 application.yaml spring:application:name: multi-datasourceprofiles:active: devdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?autoReconnecttrue&ze…

自动类型安全的REST .NET标准库refit

在SCOTT HANSELMAN 博客上看到一个好东西《Exploring refit, an automatic type-safe REST library for .NET Standard》&#xff0c;他推荐了一个.NET标准1.4 的自动类型安全的REST库refit。 refit 类似于Java的Retrofit&#xff0c;是一套RESTful架构的.NET客户端实现&#x…

Visual Studio的语言服务器协议

语言服务器协议&#xff08;LSP&#xff09;是Visual Studio Code的一个重要组件。语言服务器实际上是单独运行的编译器或分析器&#xff0c;它负责处理各种任务&#xff0c;如编译器错误报告、文本悬浮、代码自动完成&#xff08;也就是IntelliSense&#xff09;等。语言服务器…

C#和NewSQL更配 —— TiDB入门

一、背景在上一篇尝试CockroachDB&#xff08;传送门在此&#xff1a;http://www.cnblogs.com/Zachary-Fan/p/cockroachdb_net_csharp.html&#xff09;的过程中&#xff0c;发现如果从常规的RDBMS迁移过去几乎是不太可能的事情&#xff0c;所以掉头开始调研一下也是这2年比较火…

Mysql调优你不知道这几点,就太可惜了

转载自 Mysql调优你不知道这几点&#xff0c;就太可惜了 一、Mysql的逻辑分层 Mysql分为&#xff1a;连接层、服务层、引擎层、存储层。 当客户端向服务端发起操作请求的时候&#xff0c;执行过程是这样的&#xff1a; 1、客户端端与Mysql服务端的连接层建立连接&#xff…

Unity/DotNetty中集成Lidgren实现可靠UDP

lidgren有几个优点&#xff1a;分channel&#xff0c;每个channel都有单独的消息队列&#xff0c;不互相影响。每个消息可以单独选择使用可靠/不可靠传输。支持内网穿透自带加密算法。前端Unity&#xff1a;先贴一张前端使用的网络框架图&#xff1a;Lidgren的Github地址&#…

欢乐纪中A组周六赛【2019.4.13】

前言 做A组被虐好惨 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC222巨佬WHF巨佬WHF巨佬WHF140140140404040100100100000222巨佬ZZY巨佬ZZY巨佬ZZY140140140404040100100100000555巨佬HJW巨佬HJW巨佬HJW10010010010010010000000014…

面试官问:如果MySQL引起CPU消耗过大,你会怎么优化

转载自 面试官问&#xff1a;如果MySQL引起CPU消耗过大&#xff0c;你会怎么优化 谁在消耗cpu? 用户系统IO等待软硬中断空闲 祸首是谁&#xff1f; 用户 用户空间CPU消耗&#xff0c;各种逻辑运算 正在进行大量tps 函数/排序/类型转化/逻辑IO访问… 用户空间消耗大量cpu&…