欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調用

 更新時間:2019年12月02日 09:25:15   作者:慕塵  
這篇文章主要介紹了spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Consul可以用于實現(xiàn)分布式系統(tǒng)的服務發(fā)現(xiàn)與配置

服務調用有兩種方式:

A.使用RestTemplate 進行服務調用

負載均衡——通過Ribbon注解RestTemplate

B.使用Feign 進行聲明式服務調用

負載均衡——默認使用Ribbon實現(xiàn)

先使用RestTemplate來實現(xiàn)

1.服務注冊發(fā)現(xiàn)中心

啟動Consul

consul agent -dev

2.服務端

在spring boot2X整合Consul 的基礎上

添加服務provider,provider1

provider測試方法

package com.xyz.provider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class demoController {
 @RequestMapping("/hello")
 public String Hello(){
  return "hello,provider";
 }
}

provider1測試方法

package com.xyz.provider1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class demoController {
 @RequestMapping("/hello")
 public String Hello(){
  return "hello,another provider";
 }
}

啟動provider和provider1

瀏覽器訪問http://localhost:8500

有兩個服務提供者節(jié)點實例

3.客戶端

(1)添加依賴

<properties>
  <java.version>1.8</java.version>
  <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  </dependency>

</dependencies>

<dependencyManagement>
  <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>
</dependencyManagement>

(2)添加配置

server.port=8015
spring.application.name=xyz-comsumer
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.register=false
spring.cloud.consul.discovery.health-check-url=/actuator/health
spring.cloud.consul.discovery.heartbeat.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

(3)測試方法

獲取所有注冊的服務,從注冊的服務中選取一個,服務調用

package com.xyz.comsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class HelloController {
 @Autowired
 private LoadBalancerClient loadBalancer;
 @Autowired
 private DiscoveryClient discoveryClient;
 private String serviceName = "service-provider";

 @RequestMapping("/services")
 public Object services() {
  return discoveryClient.getInstances(serviceName);
 }

 @RequestMapping("/discover")
 public Object discover() {
  return loadBalancer.choose(serviceName).getUri().toString();
 }

 @RequestMapping("/hello")
 public String hello() {
  ServiceInstance serviceInstance = loadBalancer.choose(serviceName);
  String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
  return callServiceResult;
 }
}

注:

客戶端調用的服務名,是在服務端指定的,在服務端配置里使用 spring.cloud.consul.discovery.service-name指注冊到 Consul 的服務名稱

測試

啟動Consul

啟動provider和provider1

啟動comsumer

測試地址 http://localhost:8015/services

返回結果

[
 {
  "instanceId": "provider-8010",
  "serviceId": "service-provider",
  "host": "hkgi-PC",
  "port": 8010,
  "secure": false,
  "metadata": {
   "secure": "false"
  },
  "uri": "http://hkgi-PC:8010",
  "scheme": null
 },
 {
  "instanceId": "provider-8011",
  "serviceId": "service-provider",
  "host": "hkgi-PC",
  "port": 8011,
  "secure": false,
  "metadata": {
   "secure": "false"
  },
  "uri": "http://hkgi-PC:8011",
  "scheme": null
 }
]

測試地址 http://localhost:8015/discover

返回結果

  •   http://hkgi-PC:8011 或 http://hkgi-PC:8011
  •   測試地址 http://localhost:8015/hello
  •   返回結果
  •   hello,provider 或 hello,another provider

注:

結果交替出現(xiàn)的,這是因為負載均衡器是采用的是輪詢的方式

說明:

調用的過程:

A.通過LoadBalancerClient查詢服務

B.通過RestTemplate調用遠程服務

Ribbon負載均衡策略

  •   BestAvailableRule
  •   AvailabilityFilteringRule
  •   WeightedResponseTimeRule
  •   RetryRule
  •   RoundRobinRule
  •   RandomRule
  •   ZoneAvoidanceRule

自定義Ribbon負載均衡——使用隨機訪問策略

修改啟動類

package com.xyz.comsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ComsumerApplication {
 public static void main(String[] args) {
  SpringApplication.run(ComsumerApplication.class, args);
 }

 @Bean
 @LoadBalanced
 public RestTemplate restTemplate(){
  return new RestTemplate();
 }
}

服務調用

package com.xyz.comsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class RibbonHelloController {
 @Autowired
 private RestTemplate restTemplate;
 private String serviceName = "service-provider";

 @RequestMapping("/ribbon/hello")
 public String hello() {
  String callServiceResult = restTemplate.getForObject("http://"+serviceName+"/hello", String.class);
  return callServiceResult;
 }
}

配置添加

service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

重新啟動 comsumer

測試地址 http://localhost:8015/ribbon/hello

輸出的結果不再是交替出現(xiàn),改為隨機的了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 學習Java之自定義異常與NullPointerException的處理

    學習Java之自定義異常與NullPointerException的處理

    有時候Java自身提供的異常類并不能很好地表達我們的需求,所以這時候我們就可以自定義異常,也就是說,我們可以制造出一個自己的異常類,這樣就可以拋出或捕獲自己的異常了,本文就給大家詳細講講Java自定義異常與NullPointerException的處理
    2023-08-08
  • Springboot配置文件相關說明解析

    Springboot配置文件相關說明解析

    這篇文章主要介紹了Springboot配置文件相關說明解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    好久沒水后端的東西了,最近在做vue項目寫前端的代碼,所以cloud也停進度了,吃完飯突然記得我沒有在博客里寫分頁的東西,雖然項目中用到了,但是沒有拎出來,這里就拎出來看看
    2023-04-04
  • Java利用StampedLock實現(xiàn)讀寫鎖的方法詳解

    Java利用StampedLock實現(xiàn)讀寫鎖的方法詳解

    在jdk8以后,java提供了一個性能更優(yōu)越的讀寫鎖并發(fā)類StampedLock,該類的設計初衷是作為一個內部工具類,用于輔助開發(fā)其它線程安全組件。本文就來和大家一起學習下StampedLock的功能和使用
    2022-10-10
  • java實現(xiàn)簡單音樂播放器

    java實現(xiàn)簡單音樂播放器

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單音樂播放器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Java設計模式之責任鏈模式詳解

    Java設計模式之責任鏈模式詳解

    客戶端發(fā)出一個請求,鏈上的對象都有機會來處理這一請求,而客戶端不需要知道誰是具體的處理對象。這樣就實現(xiàn)了請求者和接受者之間的解耦,并且在客戶端可以實現(xiàn)動態(tài)的組合職責鏈。使編程更有靈活性
    2022-07-07
  • Java實現(xiàn)經典俄羅斯方塊游戲

    Java實現(xiàn)經典俄羅斯方塊游戲

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設計和編程的益智類視頻游戲。本文將利用Java實現(xiàn)這一經典的小游戲,需要的可以參考一下
    2022-01-01
  • Spring SseEmitter推送消息及常用方法

    Spring SseEmitter推送消息及常用方法

    SseEmitter 是 Spring Framework 提供的用于支持 Server-Sent Events(SSE)的類,它允許服務器端向客戶端推送事件流,實現(xiàn)服務器到客戶端的單向通信,這篇文章主要介紹了Spring SseEmitter推送消息,需要的朋友可以參考下
    2024-07-07
  • Spring框架JavaMailSender發(fā)送郵件工具類詳解

    Spring框架JavaMailSender發(fā)送郵件工具類詳解

    這篇文章主要為大家詳細介紹了Spring框架JavaMailSender發(fā)送郵件工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • mybatis.type-aliases-package的作用及用法說明

    mybatis.type-aliases-package的作用及用法說明

    這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論