javaJava 杂谈微服务架构和实践

第五节 微服务OTRS 补充客户端负载均衡

2018-08-23  本文已影响0人  勃列日涅夫

客户端客户端负载均衡使用

spring could在客户端负载均衡有两种选择一种是ribbon+restTemplate,另一种是feign。本主要讲解下基于ribbon+rest。当然feign(Feign默认集成了ribbon)也会简单介绍。

  1. ribbon+restTemplate实现方式
    首先需要在项目中添加pom文件中添加依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
  1. 在工程的配置文件指定服务的注册中心地址为同上节eureka client配置相同 ,例如:
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: service-ribbon
  1. 在工程的启动类中,通过@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);
    }
}

比如下例子:

@Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }
  1. Feign是一个声明式的伪Http客户端,使用Feign,只需要创建一个接口并注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡。
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class AppService{
    public static void main(String[] args) {
        SpringApplication.run( AppService.class, args );
    }
}
//定义

@FeignClient("restaurant-service")
interface RestaurantClient {
    @RequestMapping(method = RequestMethod.GET, value = "/v1/restaurants")
    Collection<Restaurant> getRestaurants(@RequestParam("name") String name);
}
//使用
@Autowired
    private RestaurantClient restaurantClient;
// 调用即可
上一篇 下一篇

猜你喜欢

热点阅读