ribbon是什么
目前主流的负载方案分为两种:一种是集中式负载均衡,在消费者和服务提供方中间 使用独立的代理方式进行负载,有硬件的(比如 F5 ),也有软件的(比如 Nginx)。 另一种 则是客户端自己做负载均衡,根据自己的请求情况做负载, Ribbon 就属于客户端自己做负载的。
一句话介绍那就是: Ribbon 是 Netflix 开源的一款用于客户端负载均衡的工具软件。
Ribbon 模块如下:
- ribbon-loadbalancer 负载均衡模块,可独立使用,也可以和别的模块一起使用。 Ribbon 内置的负载均衡算法都实现在其中。
- ribbon-eureka:基于 Eureka 封装的模块,能够快速方便地集成 Eureka。
- ribbon-transport: 基于 Netty 实现多协议的支持,比如 H坤、 Tep、 Udp 等。
- ribbon-httpclient :基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模 块,可以直接在项目中使用来调用接口 。
- ribbon-example: Ribbon 使用代码示例,通过这些示例能够让你的学习事半功倍。
- ribbon-core:一些比较核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义。
用restful+ribbon实现服务消费者
首先搭建一个注册中心和两个服务提供者,这里就不在介绍
下边路径参考:https://blog.csdn.net/weixin_44100455/article/details/97645896
创建一个ribbon实现服务消费的项目:
cloud-ribbon项目
pom.xml文件中引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
application.yml配置文件如下:
server:
port: 4000
spring:
application:
name: cloud-ribbon
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
启动类内容如下:
在启动类中通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。
@SpringBootApplication
@EnableDiscoveryClient
public class CloudRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(CloudRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
先创建一个service层,通过之前注入ioc容器的restTemplate来消费CLOUD-SERVER服务的"/hi"接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名。
StuService类的内容如下:
@Service
public class StuService {
@Autowired
private RestTemplate restTemplate;
public String hi(String name){
return restTemplate.getForObject("http://CLOUD-SERVER/hi?name=" + name,String.class);
}
}
然后再创建一个controller层,在StuController中用调用StuService 的方法
StuController类内容如下:
@RestController
public class StuController {
@Autowired
private StuService stuService;
@RequestMapping("hi")
public String hi(String name){
return stuService.hi(name);
}
}
然后在浏览器多次访问:http://localhost:4000/hi?name=xiao ;浏览器会交替显示如下页面:
因为用ribbon进行了负载均衡,所以会轮流的调用2001与2002两个端口
到此,ribbon实现服务的消费也就完成了。。。