环境:
IDEA JDK1.8 Spring Cloud Hoxton.M3 Spring Boot 2.2.0
一、Ribbon简介
Spring Cloud Ribbon是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。Feign默认集成了Ribbon。它是一个工具类框架,不像服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个微服务的基础设施中。微服务间的调用,API网关的请求转发等,都是通过Ribbon来实现的,包括后面要介绍的Feign,也是基于Ribbon实现的工具。
Ribbon已经默认实现了这些配置bean:
- IClientConfig ribbonClientConfig: DefaultClientConfigImpl
- IRule ribbonRule: ZoneAvoidanceRule
- IPing ribbonPing: NoOpPing
- ServerList ribbonServerList: ConfigurationBasedServerList
- ServerListFilter
- ribbonServerListFilter: ZonePreferenceServerListFilter
- ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer
二、创建项目
1.File ----- New -----Project
2.Spring Initializr ----- Next
3.等待创建项目中
4.输入 Group 和 Artifact 点击 Next
5.选择 Spring Cloud Routing ----- Ribbon 点击 Next
6.点击 Finish 创建完成
三、完善项目
1.引入补充的依赖 ribbon依赖和eureka依赖
<!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--eureka ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!--springboot web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.添加启动注解信息
@EnableEurekaClient package cn.mcus; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class RibbonserverApplication { public static void main(String[] args) { SpringApplication.run(RibbonserverApplication.class, args); }
3.添加RestTemplate
@Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); }
4.添加配置文件信息
server.port=8764 spring.application.name=RibbtonServer #注册到服务中心的地址 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #是否注册到eureka服务器, eureka.client.registerWithEureka=true #是否从eureka服务器获取注册信息 eureka.client.fetchRegistry=true #是否开启自我保护模式,默认为true。 eureka.server.enable-self-preservation=true
5.编写Controller
@RestController public class RibbonController { @Autowired private RibbonService ribbonService; @RequestMapping("getRibbon") public String getRibbon(String name){ String company = ribbonService.getRibbon(name); return company; } }
6.编写Service
public interface RibbonService { String getRibbon(String name); }
7.编写ServiceImpl
@Service public class RibbonServiceImpl implements RibbonService { @Autowired private RestTemplate restTemplate; @Override//程序名替代服务地址,ribbon会根据服务名自动选择服务实例 public String getRibbon(String name) { String result = restTemplate.getForObject("http://Client-Server1/test?name=" + name, String.class); return result; }
四、启动项目
1.依次启动
EurekaServer ClientServer1 ClientServer2 RibbonServer 四个项目
2.在浏览器中输入:http://localhost:8761/ 出现如下页面
红框代表服务都注册到Eureka 服务中。端口分别为8762,8763,8764
3.在浏览器中输入Ribbon 服务的地址:
再次点击刷新:端口号为8762,8763,8764
这说明当我们通过调用restTemplate.getForObject()方法时,已经做了负载均衡,访问了不同的端口的服务实例。
五、负载均衡架构
1.一个服务注册中心,EurekaServer端口为8761ClientServer1、ClientServer2、RibbonServer三个实例端口分别为8762,8763,8764,向服务注册中心注册。
2.当RibbonServer通过RestTemplate调用ClientServer1的接口时,因为用Ribbon进行了负载均衡,会轮流的调用ClientServer8762和8763 两个端口的服务接口。