springcloud入門resttemplate&eureka&ribbon&hystrix
阿新 • • 發佈:2020-12-05
restTemplate.getForObject("http://localhost:18081/user/list", String.class)
1resttemplate
建立啟動類,並在啟動類中建立RestTemplate物件,或者通過配置檔案配置bean@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }通過RestTemplate的getForObject()方法,傳遞url地址及實體類的位元組碼 RestTemplate會自動發起請求,接收響應
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