Ribbon
是 Netflix
发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的
中间层服务连接在一起。Ribbon
客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer
后面所有的机器,Ribbon
会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon
实现自定义的负载均衡算法。简单地说,Ribbon
是一个客户端负载均衡器。
Ribbon
工作时分为两步:第一步先选择 Eureka Server,
它优先选择在同一个Zone
且负载较少的Server
;第二步再根据用户指定的策略,在从Server
取到的服务注册列表中选择一个地址。其中Ribbon
提供了多种策略,例如轮询、随机、根据响应时间加权等。
Feign
是一个声明式的 web service
客户端,它使得编写 web service
客户端更为容易。创建接口,为接口添加注解,即可使用Feign
。Feign
可以使用Feign
注解或者JAX-RS
注解,还支持热插拔的编码器和解码器。Spring Cloud
为Feign
添加了Spring MVC
的注解支持,并整合了Ribbon
和Eureka
来为使用 Feign
时提供负载均衡。
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-stream-binder-rabbitartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-testartifactId>
dependency>
dependencies>
@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
@RestController
public class UserController {
/**
* 获取人员
* @param id
* @return
*/
@GetMapping("/getUsesById/{id}")
public UserVO getUsesById(@PathVariable String id) {
return new UserVO().setId(id).setAge(18).setName("这是一个18岁的小男孩");
}
}
spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://eureka-peer1:8100/eureka/,http://eureka-peer2:8200/eureka/,http://eureka-peer3:8300/eureka/
spring.freemarker.prefer-file-system-access=false
之后启动启动类,访问http://127.0.0.1:9100/getUsesById/1
查看效果
然后查看注册中心:
目前服务已经启动成功!
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-stream-binder-rabbitartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
dependencies>
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
spring.application.name=spring-cloud-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://eureka-peer1:8100/eureka/,http://eureka-peer2:8200/eureka/,http://eureka-peer3:8300/eureka/
/**
* @author wwupower
* @Title: 远程调用
* @history 2019年07月06日
* @since JDK1.8
*/
@FeignClient("spring-cloud-producer")
public interface UserSeriveClient {
/**
*
* @param id
* @return
*/
@RequestMapping(value = "/getUserById/{id}",method= RequestMethod.GET)
UserVO getUserById(@PathVariable("id") String id);
}
/**
* FeignClient
*/
@RestController
public class ConsumerController {
@Autowired
com.power.service.HelloService HelloRemote;
@Autowired
UserSeriveClient userSeriveClient;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return HelloRemote.hello(name);
}
@RequestMapping("/getUserById/{id}")
public UserVO getUserById(@PathVariable("id") String id) {
return userSeriveClient.getUserById(id);
}
}
访问地址 http://127.0.0.1:9001/getUserById/1
返回成功数据成功!
下面介绍 Ribbon
使用demo
/**
* FeignClient
*/
@RestController
public class RestTemplateController {
@Bean
// 使用轮询的方式调用服务
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping(value = "/hello2/{name}", method = RequestMethod.GET)
public String service1(@PathVariable("name") String name) {
return restTemplate().getForObject("http://localhost:9000/hello?name="+name, String.class);
}
@RequestMapping("/getUserById2/{id}")
public UserVO getUserById2(@PathVariable("id") String id) {
return restTemplate().getForObject("http://localhost:9000/getUserById/"+id, UserVO.class);
}
}
参加资料:
深入理解 Ribbon-Hystrix-Feign 三者之间的关系(一)