1. 程式人生 > 實用技巧 >springcloud入門resttemplate&eureka&ribbon&hystrix

springcloud入門resttemplate&eureka&ribbon&hystrix

restTemplate.getForObject("http://localhost:18081/user/list", String.class)

1resttemplate

建立啟動類,並在啟動類中建立RestTemplate物件,或者通過配置檔案配置bean
@Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }

通過RestTemplate的getForObject()方法,傳遞url地址及實體類的位元組碼

RestTemplate會自動發起請求,接收響應

並且幫我們對響應結果進行反序列化 getForObject.(String url,Class<T>responseType)responseType可以是json也可以是物件,後面也可以第三個引數各種變數

2微服務,統一在父工程下,方便管理

pom檔案中管理springcloud包依賴管理
<!--父工程-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>
<!--SpringCloud包依賴管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR1</version>
            <type>pom</type>
            <scope>import
</scope> </dependency> </dependencies> </dependencyManagement>

3建立服務提供者provider工程

application.yml中配置埠,資料庫源

4建立服務消費者consumer工程

在啟動類中建立resttemplate例項並放到spring容器中@bean 配置埠 在控制器中注入RestTemplate例項,接受響應後對結果進行反序列化
    @GetMapping(value = "/{id}")
    public User queryById(@PathVariable(value = "id")Integer id){
        String url 
= "http://localhost:18081/user/find/"+id; return restTemplate.getForObject(url,User.class); }

5註冊中心spring cloud eureka管理服務,發現、註冊、狀態監聽(心跳機制,續約)、動態路由

搭建eureka-server工程 pom檔案引入eureka服務依賴(對應地其他服務pom檔案上要引入eureka客戶端依賴)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>

application.yml配置 配置應用名稱spring:application:name:,作為eureka中服務的id標識,所有要被eureka管理的都要加上;名字對應url,如果是叢集,名字需相同 配置EurekaServer的地址eureka:client:service-url:defaultZone: http://localhost:7001/eureka 所有服務都配置
server:
  port: 7001    #埠號
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中作為服務的id標識(serviceId)
eureka:
  client:
    register-with-eureka: false   #是否將自己註冊到Eureka中
    fetch-registry: false   #是否從eureka中獲取服務資訊
    service-url:
      defaultZone: http://localhost:7001/eureka # EurekaServer的地址

啟動類加註解@EnableEurekaServer //開啟Eureka服務 對應地要在其他服務啟動類上加上註解 @EnableDiscoveryClient或者@EnableEurekaClient,用於開啟客戶端發現功能。 1.5.8.RELEASE對應的 Spring Cloud Edgware以後客戶端可以省略這個註解了 eureka其他配置 自我保護與實效剔除 Eureka會統計服務提供者例項,最近15分鐘心跳續約的比例是否低於85%,如果低於則會觸發自我保護機制
server:
  enable-self-preservation: false  #關閉自我保護,預設true開啟
  eviction-interval-timer-in-ms: 5000  #租約到期後5秒內沒續約就剔除

6 消費者伺服器

pom引入eureka客戶端,啟動類加上發現客戶端註解,配置檔案配置serviceId及EurekaServer地址 控制器 1)自動注入DiscoveryClient物件 DiscoveryClient有方法getInstances(String serviceId)能通過serviceId(即配置的applicationname)拿到對應的所有服務instances,進而get(0)拿到第一個serviceInstance,就可拿到服務的ip與埠
List<ServiceInstance> instances = discoveryClient.getInstances("user-provider");
ServiceInstance serviceInstance = instances.get(0);

String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/" + id; 2)或者直接通過serviceId替代ip與埠,application name包含了ip與埠
String serviceUrl = "http://user-provider/user/" + id;

7 服務提供者其他配置

使用ip訪問配置,可以不配置,推薦使用
eureka:
  instance:
    #指定IP地址
    ip-address: 127.0.0.1
    #訪問服務的時候,推薦使用IP
    prefer-ip-address: true
    #租約到期,服務時效時間,預設值90秒
    lease-expiration-duration-in-seconds: 15
    #租約續約間隔時間,預設30秒
    lease-renewal-interval-in-seconds: 40  

註冊(被)抓取間隔時間配置
registry-fetch-interval-seconds: 30

8 spring cloud ribbon負載均衡

1)工程拷貝 拷貝--改檔名--改pom檔案artifactId--在父工程pom檔案新增對應module--改埠 2)開啟負載均衡 在resttemplate配置方法上新增@loadbalanced註解 3)consumer不再手動獲取ip,通過服務名呼叫,通過serviceId替代ip與埠 4)負載均衡策略配置 user-provider: #不能省要告訴我對哪個服務提供者進行負載均衡
# 修改服務地址輪詢策略,預設是輪詢,配置之後變隨機↑
user-provider: #不能省要告訴我對哪個服務提供者進行負載均衡,NFLoadBalancerRuleClassName忘了搜ccckey裡面找帶有負載均衡規則類名,接下來賦值類,基本上你會寫隨機規則類或者輪詢規則,但是不寫配置就是輪詢
  ribbon:
    #輪詢
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    #隨機演算法
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    #重試演算法,該演算法先按照輪詢的策略獲取服務,如果獲取服務失敗則在指定的時間內會進行重試,獲取可用的服務↓
    #可以在idea軟體中按ctr shift n或者t搜對應的類進行其中一種演算法涉及時間的說明↑
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
    #加權法,會根據平均響應時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越大。剛啟動時如果統計資訊不足,則使用輪詢的策略,等統計資訊足夠,才會切換到自身規則。
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

9spring cloud hystrix熔斷器

熔斷器核心:執行緒隔離與服務降級 1)在consumer中引入熔斷器依賴 2)啟動類開啟@EnableCircuitBreaker註解 這裡可以直接用@springcloudapplication註解相當於@springbootapplication、@enablediscoveryclient、@enablecircuitbreaker三個註解 3)降級處理 區域性降級方法 需降級方法上加@HystrixCommand(fallbackMethod = "fallback")註解(這裡的fallback為方法名),並寫對應降級方法,除了方法名和方法體其他要完全一致 全域性降級方法 @DefaultProperties(defaultFallback=”defaultFailBack“),在類上,指明統一的失敗降級方法;需降級方法上仍需加@HystrixCommand註解,只是不賦值 熔斷策略配置
# 配置熔斷策略:
hystrix:
  command:
    default:
      circuitBreaker:
        # 強制開啟熔斷器 預設false關閉的。測試配置是否生效
        forceOpen: false
        # 觸發熔斷錯誤比例閾值,預設值50%!!!
        errorThresholdPercentage: 50
        # 熔斷後休眠時長,預設值5秒,即睡眠5秒去看服務如果沒有問題,熔斷器由半開到關閉,恢復服務的訪問
        sleepWindowInMilliseconds: 10000
        # 熔斷觸發最小請求次數,預設值是20,即請求訪問服務,服務出現錯誤2次開始觸發熔斷全開
        requestVolumeThreshold: 2
      execution:
        isolation:
          thread:
            # 熔斷降級超時設定,預設為1秒,即訪問服務耗時超過1秒就服務降級
            timeoutInMilliseconds: 2000