声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。

1、概念:Ribbon 负载均衡

2、具体内容

现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之中,而客户端的调用也应该通过 Eureka 完成。而这种调用就可以利用 Ribbon 技术来实现。

Ribbon 是一个服务调用的组件,并且是一个客户端实现负载均衡处理的组件。服务器端实现负载均衡可以使用 Nginx、 HAProxy、LVS 等。

2.1、Ribbon 基本使用

1、 【microcloud-consumer-80】修改 pom.xml 配置文件,追加 Ribbon 相关依赖支持包:

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>
        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency>

2、 【microcloud-consumer-80】修改 RestConfig 配置类,在获取 RestTemplate 对象的时候加入 Ribbon 的配置注解@LoadBalanced。

package cn.study.microcloud.config;import java.nio.charset.Charset;
import java.util.Base64;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic HttpHeaders getHeaders() { // 要进行一个Http头信息配置HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息String auth = "studyjava:hello"; // 认证的原始信息byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII"))); // 进行一个加密的处理// 在进行授权的头信息内容配置的时候加密的信息一定要与“Basic”之间有一个空格String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);return headers;}@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

3、 【microcloud-consumer-80】修改 aplication.yml 配置文件,追加 Eureka 的服务注册地址配置。

server:port: 80eureka: client: register-with-eureka: false #客户端不注册到eureka,只是进行服务的调用service-url: defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eureka

4、 【microcloud-consumer-80】修改项目的启动类,追加 Eureka 客户端的配置注解:

package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Consumer_80_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,args);}
}

5、 【microcloud-consumer-80】修改控制器调用类;

· 现在在 eureka 之中注册的所有服务的名称都是大写字母:MICROCLOUD-PROVIDER-DEPT;

package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/get/";public static final String DEPT_LIST_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/list/";public static final String DEPT_ADD_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/add?dname=";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {Dept dept = this.restTemplate.exchange(DEPT_GET_URL + id, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}@SuppressWarnings("unchecked")@RequestMapping(value = "/consumer/dept/list")public Object listDept() {List<Dept> allDepts = this.restTemplate.exchange(DEPT_LIST_URL, HttpMethod.GET,new HttpEntity<Object>(this.headers), List.class).getBody();return allDepts;}@RequestMapping(value = "/consumer/dept/add")public Object addDept(Dept dept) throws Exception {Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL, HttpMethod.POST,new HttpEntity<Object>(dept, this.headers), Boolean.class).getBody();return flag;}
}

访问地址:http://client.com/consumer/dept/list。这个时候有了 Ribbon 与 Eureka 整合之后用户不再去关注具体的 Rest 服务的地 址与端口号了,所有的信息获取都通过 Eureka 完成。

 2.2、Ribbon 负载均衡

通过上面的代码可以发现在 Ribbon 里面有一个负载均衡的注解:@LoadBalanced,那么就意味着现在就可以实现负载均衡的处理了。ribbon负载均衡的原理图如下

所有的服务都注册到eureka中心,并且都是同一个名字microcloud-provider-dept,用户通过eureka找到服务microcloud-provider-dept,然后通过ribbon负载均衡进行调用

1、 【microcloud-provider-dept-8001】将此项目复制为两份“microcloud-provider-dept-8002”、 “microcloud-provider-dept-8003”;

2、 【microcloud-provider-dept-*】执行各自的数据库脚本,随后修改各自的数据库连接配置;

3、 【microcloud-provider-dept-*】修改各自服务的 application.yml 配置文件;

server:port: 8001eureka:client: # 客户端进行Eureka注册的配置service-url:defaultZone: http://edmin:studyjava@eureka-7001.com:7001/eureka,http://edmin:studyjava@eureka-7002.com:7002/eureka,http://edmin:studyjava@eureka-7003.com:7003/eurekainstance:lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)instance-id: dept-8001.com  # 在信息列表时显示主机名称prefer-ip-address: true     # 访问的路径变为IP地址info:app.name: study-microcloudcompany.name: www.study.cnbuild.artifactId: $project.artifactId$build.version: $project.verson$mybatis:config-location: classpath:mybatis/mybatis.cfg.xml    # mybatis配置文件所在路径type-aliases-package: cn.study.vo            # 定义所有操作类的别名所在包mapper-locations:                                     # 所有的mapper映射文件- classpath:mybatis/mapper/**/*.xml
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource    # 配置当前要使用的数据源的操作类型driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驱动程序类url: jdbc:mysql://localhost:3306/study8001           # 数据库连接地址username: root                                  # 数据库用户名password: mysqladmin                            # 数据库连接密码dbcp2:                                          # 进行数据库连接池的配置min-idle: 5                                   # 数据库连接池的最小维持连接数    initial-size: 5                               # 初始化提供的连接数max-total: 5                                  # 最大的连接数max-wait-millis: 200                          # 等待连接获取的最大超时时间application:name: microcloud-provider-dept

 千万记住,现在所有的服务名字一定要保持一致,如果不一致则会认为是两个服务,无法进行负载均衡。

4、 修改项目中的 hosts 配置文件,在这个配置文件之中追加新的域名:

127.0.0.1 dept-8001.com
127.0.0.1 dept-8002.com
127.0.0.1 dept-8003.com

5、 【microcloud-provider-dept-*】在保证 Eureka 已经正确启动之后启动所有的部门微服务信息;

6、 【microcloud-consumer】启动消费端,消费端在 RestTemplate 配置的时候使用了负载均衡的注解。

· 访问地址:http://client.com/consumer/dept/list;

现在发现每一次获取数据都是通过不同的微服务获得的,所以现在同一个消费端就可以通过 Ribbon 实现了负载均衡配置处理。

 2.3、自定义 Ribbon 配置

在之前使用了一个“@LoadBalanced”注解,该注解描述的是一个负载均衡,但是对于负载均衡也是可以由用户修改负载均衡策略的。那么如果说现在要想去修改这样的策略,也是可以的,可以使用自定义的 LoadBalacne 的配置类。

1、 【microcloud-consumer-80】追加一个 LoadBalance 的配置类,这个类应该放在 SpringCloud 启动后找不到的位置上,所以应该 做一个新的包;

package cn.study.commons.config;import org.springframework.context.annotation.Bean;import com.netflix.loadbalancer.IRule;public class MyLoadBalanceConfig {@Beanpublic IRule ribbonRule() { // 其中IRule就是所有规则的标准return new com.netflix.loadbalancer.RandomRule() ;}
}

2、 【microcloud-consumer-80】修改程序主类,追加 Ribbon 的配置操作:

package cn.study.microcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;import cn.study.commons.config.MyLoadBalanceConfig;
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="ribbonClient",configuration=MyLoadBalanceConfig.class)
public class Consumer_80_StartSpringCloudApplication {public static void main(String[] args) {SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,args);}
}

那么此时就实现了负载均衡的配置处理操作。

3、 【microcloud-consumer-80】修改控制器程序类,在这个程序类之中可以通过负载均衡的客户端获取服务器的相关信息。

package cn.study.microcloud.controller;import java.util.List;import javax.annotation.Resource;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.vo.Dept;@RestController
public class ConsumerDeptController {public static final String DEPT_GET_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/get/";public static final String DEPT_LIST_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/list/";public static final String DEPT_ADD_URL = "http://MICROCLOUD-PROVIDER-DEPT/dept/add?dname=";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@Resourceprivate LoadBalancerClient loadBalancerClient ;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {ServiceInstance serviceInstance = this.loadBalancerClient.choose("MICROCLOUD-PROVIDER-DEPT") ;System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId());Dept dept = this.restTemplate.exchange(DEPT_GET_URL + id, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}}

那么此时后台通过指定的负载均衡的配置程序,就可以取得即将操作的主机的信息。

 2.4、禁用 Eureka 实现 Ribbon 调用

在之前使用的技术都是通过 Eureka 访问了 Eureka 之中的指定名称的服务而获得了所需要的数据,但是在 Ribbon 设计的时候 考虑到了一个脱离 Eureka 使用的环境。如果要真进行了 Eureka 的脱离,代码将变为如下的形式。

1、 【microcloud-consumer-ribbon】修改 application.yml 配置文件:

server:port: 80ribbon:eureka:enabled: falsemicrocloud-provider-dept:ribbon:listOfServers: http://dept-8001.com:8001,http://dept-8002.com:8002,http://dept-8003.com:8003

2、 【microcloud-consumer-ribbon】修改 RestConfig 配置程序类,不再需要使用“@LoadBalanced”注解:

package cn.study.microcloud.config;import java.nio.charset.Charset;
import java.util.Base64;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Beanpublic HttpHeaders getHeaders() { // 要进行一个Http头信息配置HttpHeaders headers = new HttpHeaders(); // 定义一个HTTP的头信息String auth = "studyjava:hello"; // 认证的原始信息byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII"))); // 进行一个加密的处理// 在进行授权的头信息内容配置的时候加密的信息一定要与“Basic”之间有一个空格String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);return headers;}@Bean// @LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

3、 【microcloud-consumer-ribbon】修改 ConsumerDeptController控制器,直接通过获取主机和端口调用后台微服务:

package cn.study.microcloud.controller;import java.net.URI;import javax.annotation.Resource;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import cn.study.commons.config.MyLoadBalanceConfig;
import cn.study.vo.Dept;@RestController
@RibbonClient(name = "microcloud-provider-dept", configuration = MyLoadBalanceConfig.class)
public class ConsumerDeptController {public static final String DEPT_REST_TOPIC = "microcloud-provider-dept";@Resourceprivate RestTemplate restTemplate;@Resourceprivate HttpHeaders headers;@Resourceprivate LoadBalancerClient loadBalancerClient;@RequestMapping(value = "/consumer/dept/get")public Object getDept(long id) {ServiceInstance serviceInstance = this.loadBalancerClient.choose(DEPT_REST_TOPIC);System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId()+ "、uri = " + serviceInstance.getUri());URI deptUri = URI.create(String.format("http://%s:%s/dept/get/" + id,serviceInstance.getHost(), serviceInstance.getPort()));Dept dept = this.restTemplate.exchange(deptUri, HttpMethod.GET,new HttpEntity<Object>(this.headers), Dept.class).getBody();return dept;}
}

这种模式并不标准,只能够说是 Ribbon 自己所具备的一项功能而已,实际之中如果不是非常必要,不建议使用。

转载于:https://www.cnblogs.com/leeSmall/p/8824802.html

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)...相关推荐

  1. SpringCloud:Ribbon负载均衡(基本使用、 负载均衡、自定义配置、禁用 Eureka 实现 Ribbon 调用)

    现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之 ...

  2. SpringCloud系列七:使用Ribbon实现客户端侧负载均衡

    1. 回顾 在前面,已经实现了微服务的注册与发现.启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上. 但是,在生成环境中,各个微服务都会部署多个实例,因 ...

  3. SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

    1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器. 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-c ...

  4. SpringCloud系列之服务消费Ribbon和Feign区别

    在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个 ...

  5. SpringCloud系列-Ribbon的基本应用

    一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...

  6. 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign

    SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...

  7. SpringCloud笔记(二)使用DiscoveryClient手动实现客户端负载均衡

    1.什么是客户端负载均衡(Ribbon)? Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮训负载均衡策略.既在客户端实现负载均衡. 2.什么是服务端负 ...

  8. SpringCloud集群的搭建,分布式的实现,负载均衡的几种方式,路由,页面监听

    SpringCloud 服务注册与发现--Netflix Eureka 负载均衡: 客户端负载均衡--Netflix Ribbon 服务端负载均衡:--Feign(其也是依赖于Ribbon,只是将调用 ...

  9. springcloud+springboot+Eureka+Feign+Ribbon+Hystrix+Zuul

    Springcloud集成Eureka Eureka服务端和客户端 本实例采用springboot,eureka和feign/ribbon,hystrix,zuul,mybatis,redis 1. ...

最新文章

  1. Win7下JDK环境变量设置批处理(转)
  2. 在线富文本编辑器 UMeditor
  3. 归类练习的有效性思考
  4. sql server 2005 T-SQL ALTER ENDPOINT (Transact-SQL)
  5. Windows10 64位 安装 Postgresql 数据库
  6. python subplot_Python金融应用之图表制作(五)
  7. 《Qt 数据库详解》博客系列文章
  8. 纯CSS的方法解决文字溢出与截断的问题
  9. 从外行到外包,从手工测试到知名互联大厂测开 我经历了我这个年龄段不该经历的事情...
  10. 博途PLC 1200/1500PID PID_Temp 加热制冷双输出+级联控制(串级控制)
  11. 苹果台式电脑怎么使用计算机,苹果台式电脑开开不了机怎么办
  12. 我在 CMU 的八年博士生涯...
  13. WMS入库作业_核心业务流程
  14. 爬虫-漫画喵的100行逆袭
  15. 用Python对淘宝用户行为数据的分析
  16. 02 离线安装管理ceph图形化界面calamari
  17. 【ng-alain】解决sf设置了visibleIf的字段,默认执行required验证
  18. 迅为RK3568开发板Linux_NVR_SDK系统开发-查看NPU/GPU/CPU频率使用率
  19. 揭示生命奥秘,促进疫苗研发,生物物理学有望掀起下一轮医学革命
  20. 广州住房公积金管理中心综合业务管理系统容灾项目(GZIT2010-ZB0103)招标公告...

热门文章

  1. java堆外内存为何比java堆更适合用来进行网络IO操作
  2. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密
  3. VB 更换设置桌面背景图片函数
  4. 博客文章加线框/表格
  5. TensorFlow教程之API DOC 6.1.1Class tensorflow::Env
  6. phpcms v9前台getshell
  7. Dom-Attribute对象
  8. Magcodes.WeiChat——自定义CustomCreationConverter之实现微信自定义菜单的序列化
  9. (二)SSO之CAS框架单点退出,自己定义退出界面.
  10. SSD 下的 MySQL IO 优化