Hi:我是少军,又到了凌晨一点睡不着时间,所以就把白天做的Feign实现负载均衡的代码整理下作为笔记。同时也希望对你的学习有所帮助!
这篇文章主要描述实现Fegin的负载均衡,并不做深层次的介绍。
依赖:
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.cloud
spring-cloud-starter-openfeign
启动类:
@SpringBootApplication
@EnableFeignClients
public classConsulConsumerFeignApplication {
public static voidmain(String[] args) {
SpringApplication.run(ConsulConsumerFeignApplication.class,args);
}
}
声明开启feign客户端,feign基于ribbon进行了扩展,简化了负载均衡的实现。使应用由Ribbon的面向服务编程转为我们熟悉的面向接口编程!
补充下前面文章提到的的Ribbon配置,可以通过下面的方式构建自带负载均衡的RestTemplate:
@Configuration
public classRibbonConfigBean {
@Autowired
RestTemplateBuilderbuilder;
publicRibbonConfigBean(RestTemplateBuilder builder) {
this.builder= builder;
}
/**
* `@LoadBalanced让restTemplate自带负载均衡,通过应用名称来实现自动负载均衡
*@return
*/
@LoadBalanced
@Bean
publicRestTemplategetRestTemplate(){
returnbuilder.build();
}
}
创建服务提供者对应的接口:
@FeignClient(value="Your App Name")
@Component
public interfaceUserService {
@GetMapping("/users/")
OptionalfindById(@PathVariable(value="id") Long id);
@GetMapping("/users///")
Usersave(@PathVariable(value="id") Long id,@PathVariable(value="name") String name,
@PathVariable(value="dsno") String dsno);
@GetMapping(value="/users/all")
Optional
>findAll();
}
声明此接口为Feign客户端,指定你的服务提供者应用名称(根据不同应用找不同服务提供者的接口)
声明该接口为组建类,可以被Spring容器扫描并自动装载到需要的位置
接口地址要一一对应,填坑(
@PathVariable(value="id")
)
参数一定要指定value,否则无法将此接口加载到容器中,会抛出异常!
构建服务消费者接口:
@RestController
public classCallHelloController {
@Autowired
privateUserServiceuserService;
@RequestMapping("users/all")
publicOptional
>call(HttpServletRequest request) {
Optional
> all =userService.findAll();
returnall;
}
@GetMapping("/users/")
publicOptionalfindById(@PathVariableLong id){
returnuserService.findById(id);
}
@GetMapping("/users///")
publicUsersave(@PathVariableLong id,@PathVariableString name,@PathVariableString dsno){
returnuserService.save(id,name,dsno);
}
}
相关配置文件(跟之前一样,不需要改变):
spring.application.name=spring-cloud-consul-consumer
server.port=8504
spring.cloud.consul.host=192.168.137.136
spring.cloud.consul.port=8500
#设置不需要注册到consul中
spring.cloud.consul.discovery.register=false
#服务提供之应用名称
rest.url.prefix.url=http://dobqop-consul-service-yml
cloud.producer.name=dobqop-consul-service-yml
以上为本次示例的实现。相比于ribbon,使用feign大大的减少了我们的代码量,取代使用restTemplate后,我们可以更加专注于代码层面的开发,不需要更多的数据转换等优点。
以后随着深入了解我会继续完善这篇文章,详细描述关于使用feign的相关配置。如果你有更好的方案,希望能得到你更多的指导^_^
领取专属 10元无门槛券
私享最新 技术干货