第五节 微服务OTRS 补充客户端负载均衡
客户端客户端负载均衡使用
spring could在客户端负载均衡有两种选择一种是ribbon+restTemplate,另一种是feign。本主要讲解下基于ribbon+rest。当然feign(Feign默认集成了ribbon)也会简单介绍。
ribbon+restTemplate实现方式
首先需要在项目中添加pom文件中添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
在工程的配置文件指定服务的注册中心地址为同上节eureka client配置相同 ,例如:
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/server: port: 8764spring: application: name: service-ribbon
在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明restRemplate开启负载均衡的功能。
例如在api-server项目启动类如下
@SpringBootApplication@EnableEurekaClient@EnableCircuitBreaker@EnableResourceServer@Configuration@ComponentScan({"com.packtpub.mmj.api.service", "com.packtpub.mmj.common"})public class ApiApp { //................................省略 @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { LOG.info("Register MDCHystrixConcurrencyStrategy"); HystrixPlugins.getInstance().registerConcurrencyStrategy(new MDCHystrixConcurrencyStrategy()); SpringApplication.run(ApiApp.class, args); } }
在使用restTemplate向其他服务发送请求就会通过eureka server 通过负载策略代理到相应的服务上。
注意:ribbon中会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名。所以使用的url要用服务名称而不是IP:port这种形式
比如下例子:
@Autowired RestTemplate restTemplate; public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); }
Feign是一个声明式的伪Http客户端,使用Feign,只需要创建一个接口并注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡。
使用的第一步添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步 工程配置application.yml,和上述ribbon相同 略
第三步 启动类加上@EnableFeignClients注解开启Feign的功能,例如:
@SpringBootApplication@EnableEurekaClient@EnableDiscoveryClient@EnableFeignClientspublic class AppService{ public static void main(String[] args) { SpringApplication.run( AppService.class, args ); } }
第四步 使用
只需要定义一个接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了restaurant-service服务的“/v1/restaurants”,(spring 会替我们实现有@ FeignClient的接口)代码如下:
//定义@FeignClient("restaurant-service")interface RestaurantClient { @RequestMapping(method = RequestMethod.GET, value = "/v1/restaurants") Collection<Restaurant> getRestaurants(@RequestParam("name") String name); }//使用@Autowired private RestaurantClient restaurantClient;// 调用即可
总结: 上述两种方式均为客户端服务在调用,其他服务的请求会先通过eureka server查找已注册的服务根据相应的负载策略,转到具体的服务
作者:勃列日涅夫
链接:https://www.jianshu.com/p/ce2a316ec248
共同学习,写下你的评论
评论加载中...
作者其他优质文章