Ribbon--学习笔记(2)
目录
一、参考spring cloud的官方文档
--1、客户端负载平衡器:Ribbon
--2、如何加入Ribbon
--3、自定义Ribbon客户端
--4、使用属性自定义Ribbon客户端
--5、如何使用Ribbon不使用Eureka
--6、在Ribbon中禁用Eureka使用
二、实操
--1、在这个示例中有三个角色:注册中心、服务提供方、服务消费方
--2、消费方是如何配置的
--3、启动的效果
--4、原理图
一、参考spring cloud的官方文档
1、客户端负载平衡器:Ribbon
Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经使用Ribbon,所以如果您使用@FeignClient
,则本节也适用。
Ribbon中的中心概念是指定客户端的概念。每个负载平衡器是组合的组合的一部分,它们一起工作以根据需要联系远程服务器,并且集合具有您将其作为应用程序开发人员(例如使用@FeignClient
注释)的名称。Spring Cloud使用RibbonClientConfiguration
为每个命名的客户端根据需要创建一个新的合奏作为ApplicationContext
。这包含(除其他外)ILoadBalancer
,RestClient
和ServerListFilter
。
2、如何加入Ribbon
要在项目中包含Ribbon,请使用组org.springframework.cloud
和工件ID spring-cloud-starter-ribbon
的起始器。
3、自定义Ribbon客户端
您可以使用
中的外部属性来配置Ribbon客户端的某些位,这与使用Netflix API本身没有什么不同,只能使用Spring Boot配置文件。本机选项可以在CommonClientConfigKey
(功能区内核心部分)中作为静态字段进行检查。
Spring Cloud还允许您通过使用@RibbonClient
声明其他配置(位于RibbonClientConfiguration
之上)来完全控制客户端。例:
@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}
在这种情况下,客户端由RibbonClientConfiguration
中已经存在的组件与FooConfiguration
中的任何组件组成(后者通常会覆盖前者)。
警告:
FooConfiguration
必须是@Configuration
,但请注意,它不在主应用程序上下文的@ComponentScan
中,否则将由所有@RibbonClients
共享。如果您使用@ComponentScan
(或@SpringBootApplication
),则需要采取措施避免包含(例如将其放在一个单独的,不重叠的包中,或者指定要在@ComponentScan
)。
Spring Cloud Netflix默认情况下为Ribbon(BeanType
beanName:ClassName
)提供以下bean:
IClientConfig
ribbonClientConfig:DefaultClientConfigImpl
IRule
ribbonRule:ZoneAvoidanceRule
IPing
ribbonPing:NoOpPing
ServerList
ribbonServerList:ConfigurationBasedServerList
ServerListFilter
ribbonServerListFilter:ZonePreferenceServerListFilter
ILoadBalancer
ribbonLoadBalancer:ZoneAwareLoadBalancer
ServerListUpdater
ribbonServerListUpdater:PollingServerListUpdater
创建一个类型的bean并将其放置在@RibbonClient
配置(例如上面的FooConfiguration
)中)允许您覆盖所描述的每个bean。例:
@Configuration
public class FooConfiguration {
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl();
}
}
这用PingUrl
代替NoOpPing
。
4、使用属性自定义Ribbon客户端
从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义Ribbon客户端。
这允许您在不同环境中更改启动时的行为。
支持的属性如下所示,应以
为前缀:
NFLoadBalancerClassName
:应实施ILoadBalancer
NFLoadBalancerRuleClassName
:应实施IRule
NFLoadBalancerPingClassName
:应实施IPing
NIWSServerListClassName
:应实施ServerList
NIWSServerListFilterClassName
应实施ServerListFilter
注意:
在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class)
定义的bean和由Spring Cloud Netflix提供的默认值。
要设置服务名称users
的IRule
,您可以设置以下内容:
application.yml
users:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
5、如何使用Ribbon不使用Eureka
Eureka是一种方便的方式来抽象远程服务器的发现,因此您不必在客户端中对其URL进行硬编码,但如果您不想使用它,Ribbon和Feign仍然是适用的。假设您已经为“商店”申请了@RibbonClient,并且Eureka未被使用(甚至不在类路径上)。Ribbon客户端默认为已配置的服务器列表,您可以提供这样的配置
application.yml
stores:
ribbon:
listOfServers: example.com,google.com
6、在Ribbon中禁用Eureka使用
设置属性ribbon.eureka.enabled = false将明确禁用在Ribbon中使用Eureka。
application.yml
ribbon:
eureka:
enabled: false
二、实操
1、在这个示例中有三个角色:注册中心、服务提供方、服务消费方
- 注册中心是eureka-demo-server(参考 Eureka--学习笔记(1))
- 服务提供方是eureka-demo-client(参考 Eureka--学习笔记(1))
- 消费方是ribbon-demo
2、消费方是如何配置的
pom.xml
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8082
spring:
application:
name: ribbon-demo-consumer
启动类
@SpringBootApplication
public class RibbonDemoApplication {
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonDemoApplication.class, args);
}
}
调用类
@RestController
@RequestMapping("/call")
public class CallController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hello")
public String hello(){
return restTemplate.getForObject("http://EUREKA-DEMO-CLIENT-1/",String.class);
}
@GetMapping("/hi/{name}")
public String hi(@PathVariable("name") String name){
return restTemplate.getForObject("http://EUREKA-DEMO-CLIENT-1/test/say/hello/" + name,String.class);
}
}
Ps:提供者(eureka-demo-client)的调用类参考
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("say/hello/{name}")
public String sayHello(@PathVariable("name") String name ){
return "hello " + name;
}
}
3、启动的效果
UI界面显示了提供者和消费者
浏览器中输入http://localhost:8082/call/hello/
浏览器中输入http://localhost:8082/call/hi/caowo