Spring Cloud 使用Spring Cloud Loadbalancer訪問服務地址


獲取服務地址

  使用的EurekaClient : getNextServerFromEureka()

   使用的DiscoveryClient: getInstances()

 

Load Balancer Client  (負載均衡客戶端)

  加上@LoadBalaced: 為RestTemplate 或WebClient增加負載均衡的支持。

  Load Balancer Client 的簡單使用

  pom文件的引入

/**指定spring-cloud.version**/
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
/**在注冊的時候提供信息*/
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

/**dependencyManagement 引入springCloud Dependency*/
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

 

bootstarp.properties文件的簡單配置

#聲明服務名稱
spring.application.name=my-customer-service

application.properties聲明端口號

#隨機端口
server.port=0

顯示聲明開啟DiscoveryClient

在Application啟動類上添加 ,@EnableDiscoveryClient注解

定義requestFactory

   @Bean
    public HttpComponentsClientHttpRequestFactory requestFactory() {
        PoolingHttpClientConnectionManager connectionManager =
                new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
        connectionManager.setMaxTotal(200);
        connectionManager.setDefaultMaxPerRoute(20);

        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .evictIdleConnections(30, TimeUnit.SECONDS)
                .disableAutomaticRetries()
                // 有 Keep-Alive 認里面的值,沒有的話永久有效
                //.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
                // 換成自定義的
                .setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
                .build();

        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory(httpClient);

        return requestFactory;
    }
CustomConnectionKeepAliveStrategy
public class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {
    private final long DEFAULT_SECONDS = 30;

    @Override
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
        return Arrays.asList(response.getHeaders(HTTP.CONN_KEEP_ALIVE))
                .stream()
                .filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout")
                        && StringUtils.isNumeric(h.getValue()))
                .findFirst()
                .map(h -> NumberUtils.toLong(h.getValue(), DEFAULT_SECONDS))
                .orElse(DEFAULT_SECONDS) * 1000;
    }
}

注入RestTemplate

  @LoadBalanced
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder
                .setConnectTimeout(Duration.ofMillis(100))
                .setReadTimeout(Duration.ofMillis(500))
                .requestFactory(this::requestFactory)
                .build();
    }

 

RestTemplate的使用

 
         
@Autowired
    private RestTemplate restTemplate;

// 請求列表數據
        ResponseEntity<List<Info>> list = restTemplate
                .exchange("請求的服務地址", HttpMethod.GET, null, ptr);
list.getBody().forEach(c -> log.info("info": {}", c));

// 插入數據
        MyRequest orderRequest = MyRequest.builder()
                .param("value1")
                // 集合數據
                .param(Arrays.asList("value2"))
                .build();

        RequestEntity<MyRequest> request = RequestEntity
                .post(UriComponentsBuilder.fromUriString("服務地址").build().toUri())
                .body(orderRequest);

ResponseEntity<Order> response = restTemplate.exchange(request, Order.class);
 
         

 

Order order = restTemplate
                .getForObject("http://waiter-service/order/{id}", Order.class, id);

  

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM