史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

article/2025/9/18 23:17:56

转载请标明出处:
https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html
本文出自方志朋的博客

个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html

最新Finchley版本:
https://www.fangzhipeng.com/springcloud/2018/08/02/sc-f2-ribbon.html
或者
http://blog.csdn.net/forezp/article/details/81040946

在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest。

一、ribbon简介

Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using @FeignClient then this section also applies.

-----摘自官网

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。

ribbon 已经默认实现了这些配置bean:

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl

  • IRule ribbonRule: ZoneAvoidanceRule

  • IPing ribbonPing: NoOpPing

  • ServerList ribbonServerList: ConfigurationBasedServerList

  • ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter

  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、准备工作

这一篇文章基于上一篇文章的工程,启动eureka-server 工程;启动service-hi工程,它的端口为8762;将service-hi的配置文件的端口改为8763,并启动,这时你会发现:service-hi在eureka-server注册了2个实例,这就相当于一个小的集群。访问localhost:8761如图所示:

如何一个工程启动多个实例,请看这篇文章:https://blog.csdn.net/forezp/article/details/76408139

在这里插入图片描述

三、建一个服务消费者

重新新建一个spring-boot工程,取名为:service-ribbon;
在它的pom.xml文件分别引入起步依赖spring-cloud-starter-eureka、spring-cloud-starter-ribbon、spring-boot-starter-web,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.forezp</groupId><artifactId>service-ribbon</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>service-ribbon</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RC1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

在工程的配置文件指定服务的注册中心地址为http://localhost:8761/eureka/,程序名称为 service-ribbon,程序端口为8764。配置文件application.yml如下:

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
server:port: 8764
spring:application:name: service-ribbon

在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。

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

写一个测试类HelloService,通过之前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码如下:

@Service
public class HelloService {@AutowiredRestTemplate restTemplate;public String hiService(String name) {return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);}}

写一个controller,在controller中用调用HelloService 的方法,代码如下:


/*** Created by fangzhipeng on 2017/4/6.*/
@RestController
public class HelloControler {@AutowiredHelloService helloService;@RequestMapping(value = "/hi")public String hi(@RequestParam String name){return helloService.hiService(name);}}

在浏览器上多次访问http://localhost:8764/hi?name=forezp,浏览器交替显示:

hi forezp,i am from port:8762

hi forezp,i am from port:8763

这说明当我们通过调用restTemplate.getForObject(“http://SERVICE-HI/hi?name=”+name,String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。

四、此时的架构

在这里插入图片描述

  • 一个服务注册中心,eureka server,端口为8761
  • service-hi工程跑了两个实例,端口分别为8762,8763,分别向服务注册中心注册
  • sercvice-ribbon端口为8764,向服务注册中心注册
  • 当sercvice-ribbon通过restTemplate调用service-hi的hi接口时,因为用ribbon进行了负载均衡,会轮流的调用service-hi:8762和8763 两个端口的hi接口;

源码下载:https://github.com/forezp/SpringCloudLearning/tree/master/chapter2

更多阅读

史上最简单的 SpringCloud 教程汇总

SpringBoot教程汇总

Java面试题系列汇总

五、参考资料

本文参考了以下:

spring-cloud-ribbon

springcloud ribbon with eureka

服务消费者


扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客)


http://chatgpt.dhexx.cn/article/PrQ7C9oI.shtml

相关文章

史上最简单的 SpringCloud 教程 | 终章

转载请标明出处&#xff1a; http://blog.csdn.net/forezp/article/details/70148833 本文出自方志朋的博客 扫码关注有惊喜 &#xff08;转载本站文章请注明作者和出处 方志朋的博客&#xff09; 个人博客纯净版https://www.fangzhipeng.com/spring-cloud.html 错过了这一篇…

SpringCloud-Finchley集成Zuul服务网关组件并实现回退

1.服务网关Zuul介绍 服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中&#xff0c;除了具备服务路由、均衡负载功能之外&#xff0c;它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色&#xff0c;为微…

数控机床设备物联网远程控制解决方案

数控机床设备应用物联网技术方案实现远程监控管理背景 数控机床设备利用先进的计算机和网络技术进行设备物联网。利用计算机硬件、软件、网络设备通信设备以及其他办公设备,进行信息的收集、传输、加工、储存、更新和维护,以战略竟优、提高效率为目的,支持高层决策、中层管理…

远程控制树莓派

一、局域网 1. 让树莓派连上手机热点或wifi 将空白的ssh文件放入树莓派SD卡的boot盘 手动创建一个空白记事本.txt文件&#xff0c;命名为ssh&#xff0c;重命名&#xff0c;删掉.txt扩展名。将这个文件放入SD卡的boot盘中。 配置wifi文件&#xff0c;放入SD卡的boot盘 用同样…

推荐一款国产远程控制软件ToDesk,轻量级,不限速,开启云办公新模式

一、远程办公新时代 前段时间&#xff0c;我们公司使用的向日葵远程控制竟然崩了&#xff0c;导致无法登录&#xff0c;当时以为是公司网络出问题了&#xff0c;结果并妹有。后来就看到官方回应说&#xff0c;因为大量用户涌入导致服务器宕机了&#xff01; 不管你们信不信&a…

远程控制电脑

任意网络环境下的设备远程控制任意网络环境下的设备 对于远程操控电脑已经不是什么难的事情了&#xff0c;但是对于有的操作方法其实还是有难度的&#xff0c;今天我就介绍一下如何远程控制电脑。 1、远程控制的好处 远程控制的好处那就多了&#xff0c;不管你是学生还是…

企业如何实现IoT物联网远程控制

在IoT物联网革命中&#xff0c;一切都正在变得智能化&#xff0c;因此也可以称其为连接设备的革命。如今&#xff0c;物联网采用信息化技术手段&#xff0c;促进了人类生活和生产服务的全面升级&#xff0c;从智能家居硬件、智能穿戴、智能交通、智能医疗、智能车载、嵌入式开发…

服务器如何开启远程控制,远程控制命令设置方法介绍

大家在长时间的使用电脑以后,电脑就会出现一些毛病,这个时候人们都会给电脑维修工打电话亲上 门 儿服务,而大家都知道上门儿服务费用是非常的高的。但是远程控制出现就解决了这个问题,大家可以通过网络工程师对自己电脑进行远程控制,从而实现修理电脑的目的。但是有非常多…

快速实现远程控制Android手机

直接在web端或者手机端远程控制其他手机&#xff0c;想想都刺激&#xff0c;于是在google上一阵狂搜&#xff0c;发现很多方案都要root手机&#xff0c;直接pass&#xff0c;还有的方案需要写大量看不懂的代码&#xff0c;pass。最近一直在研究的冰狐智能辅助平台出了一个远程控…

内网远程控制安卓设备软件推荐

有些企业需要在内网环境远程控制安卓设备&#xff0c;实现批量维护安卓设备等需求。有什么软件或者解决方案&#xff0c;可以实现内网远程控制安卓设备呢&#xff1f; 这个问题要分两个情况解决&#xff0c;看你能不能走外网。如果IT和安卓设备属于同一个局域网&#xff0c;但…

向日葵远程控制的使用方法

1. 首先在办公电脑上下载安装向日葵远程控制端&#xff0c;注册账号&#xff0c;记录保存“允许控制本机”的“本机识别码”和“本机验证码”&#xff0c;并设置“开机自动启动”&#xff0c;保持向日葵的开启状态&#xff1b; 2. 在家用电脑上下载安装向日葵远程控制端&#…

远程控制工具哪个好?向日葵VS ToDesk,安卓移动设备远程操控哪个更好用?

现如今&#xff0c;科技的发展&#xff0c;使得手机的功能也越来越智能化&#xff0c;可有些小伙伴对智能化手机有许多不会操作的地方&#xff0c;这时&#xff0c;就可以利用远程手机软件&#xff0c;来请求别人的远程帮助。或者&#xff0c;当我们的手机丢失了&#xff0c;也…

计算机远程控制阀门开启,阀门远程控制系统

原标题&#xff1a; 阀门远程控制系统 一、系统概述 阀门远程监控系统以无线方式通过云服务中心发出指令来控制放置远端的(如野外、地下管网等)电动阀们设备&#xff0c;从而实现电动阀门的开关&#xff0c;并将阀门的开关状态、工作状态、设备是否在线、历史数据查询等信息反馈…

如何免ROOT,实现安卓设备远程控制?

关于远控移动设备&#xff0c;小编经常收到一些疑问&#xff0c;最常见的就是远控安卓必须root吗&#xff1f; 那必须不是啊&#xff01;无需root&#xff0c;远控安卓一样有的是办法&#xff01; 今天小编就带大家来看一下如何轻松解决免root&#xff0c;远控安卓手机的办法…

android远程管理Windows,使用Android、IOS设备远程控制Windows系统

大家都知道&#xff0c;Windows支持远程控制功能&#xff0c;可在同一局域网内连接控制电脑&#xff0c;借助RD网关还可以在互联网里自由连接控制其它内网中的某台电脑。微软其实针对Android、IOS、Mac等系统都推出了RD客户端软件。 (IOS、Mac版在App Store中搜索下载) 1. 首先…

5G工业网关的设备远程控制应用有哪些?

综合利用5G、自动控制、边缘计算等技术&#xff0c; 建设或升级设备操控系统&#xff0c;通过在工业设备、摄像头、传感器等数据采集终端上部署乾元通聚合路由等工业网关设备&#xff0c;实现工业设备与各类数据采集终端的网络化&#xff0c;设备操控员可以通过5G网络远程实时获…

thingsboard+ESP8266+MQTT实现设备远程控制

简介&#xff1a; 本次主要想实现功能&#xff1a;thingsboard平台远程控制设备 设备&#xff08;ESP8266上的灯作为一台设备&#xff0c;模拟控制灯的开关&#xff09; 指令传输通过thingsboard平台集成的MQTT协议 利用thingsboard仪表盘库的一个控制组件模拟发送指令来控制我…

工业物联网数控机床设备远程控制整体解决方案

1、数控机床设备是复杂性的工业机器&#xff0c;机械制造、计算机、液压、传感、信息处理、光机电等技术的机电一体化产品。 2、数控机床设备的故障会严重阻碍着生产的效率和质量&#xff0c;目前先进的数控系统均配有完备的远程通信接口和与上位机进行通信的完整协议&#xff…

plc设备远程控制系统

采用工业互联网与大数据分析技术,实时监控异地设备运行状态,为设备提供定制化的响应式服务,包括设备的智能分析诊断、预测性维护、节能管理、空中升级和远程作业指导等,减少因设备意外停车引起的生产停滞,提高设备利用率,为设备健康与安全高效生产保驾护航。 实时监控设…

如何远程控制电脑?3个方法轻松搞定!

案例&#xff1a;如何远程控制电脑&#xff1f; 【我不想时时刻刻都带着自己的电脑&#xff0c;听朋友说可以远程电脑。有没有大神分享一下具体的操作方法&#xff1f;感谢&#xff01;】 随着科技的不断进步&#xff0c;远程控制电脑已经不再是一件难以实现的事情。如今&…