通訊的方式主要有兩種,Http 和 RPCjava
SpringCloud使用的是Http方式通訊, Dubbo的通訊方式是RPCweb
記錄學習SpringCloud的restful方式: RestTemplate (本篇)、Feignspring
RestTemplate 相似 HttpClient,使用更簡潔一些,下面一步一步學習服務器
在以前學習中;在E:/MyCloud的中已經存在名爲eureka的註冊中心,和一個名爲client的服務restful
不用管,爲了區分開學習,從新建兩個服務,一個product,一個order,這裏不說怎麼建了,IDEA一鍵生成便可(註冊中心一直是開啓狀態)併發
product 服務端口不設置,在啓動項中設置,方即可以開啓不一樣端口的多服務,在第(四)篇有記錄,啓動一個8081 和 一個8082,便於測試app
yml中配置 : (spring.application.name=product 標識name後面會用到)負載均衡
spring: application: name: product eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
加一個簡單的接口,product 服務這塊就完成了,兩個應用都啓動(8081,8082)dom
@RestController public class ProductsController { @GetMapping("/products") public String products(){ return "hello,this is products"; } }
在註冊中心,能夠發現服務,PRODUCT學習
order 服務 端口設置8083,spring.application.name=order,其餘基礎yml配置與product一致
訪問product服務中的接口的幾種方式,以下: Controller 代碼
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import static java.lang.String.format; @RestController @Slf4j public class OrderController { //第二種方式 使用 @Autowired private LoadBalancerClient client; //第三種方式 使用 @Autowired private RestTemplate restTemplate; @GetMapping("/get") public String getProducts(){ RestTemplate restTemplate=new RestTemplate(); //第一種方式 直接請求 getForObject(請求url,返回類型) String first_type=restTemplate.getForObject("http://localhost:8081/products",String.class); log.info("first response={}",first_type); //若是肯定就那個一個,用最簡單的就行了 //若是product項目啓動不一樣端口服務,用負載均衡方式,那麼第一種方式就比較死氣,恰好指向的那個掛了,就很差了 //第二種方式 經過註冊中心,1.獲取host+port,2.獲取uri 併發出請求 //choose的參數爲註冊中心Instances currently registered with Eureka下面Application的名字 //服務會本身選擇一個服務接口發送請求,負載均衡的方式選擇有不少,好比隨機,順序等等 ServiceInstance instance=client.choose("PRODUCT"); String url= format("http://%s:%s",instance.getHost(),instance.getPort())+"/products"; String second_type_1=restTemplate.getForObject(url,String.class); System.out.println(second_type_1); String second_type_2=restTemplate.getForObject(instance.getUri()+"/products",String.class); System.out.println(second_type_2); //第三種方式,相似第二種方式,須要將restTemplate以註解@bean方式注入,並加上@LoadBalanced註解 //請求拼接http:// + Application的名字 + 接口名字 String third_type=restTemplate.getForObject("http://PRODUCT/products",String.class); System.out.println(third_type); return ""; } }
第三種使用到RestTemplateConfig的代碼:
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
Eureka屬於客戶端發現,他的負載均衡屬於客戶端向服務器獲取已經註冊的可用服務信息,而後根據其負載均衡的策略(隨機,順序等),選其中一個,發送請求,這個過程是在客戶端完成的,屬於軟負載,並不須要服務器的參與
SpringCloud中客戶端負載均衡組件是Ribbon,有上面的RestTemplate,還有Feign、zuul等後面繼續學習,都使用到Ribbon
Ribbon實現軟負載有三點核心:
服務發現 : 找服務,就像上面測試的依據application的名字,找到是哪一個服務
服務選擇規則 : 從多個服務中,選擇一個有效的服務
服務監聽 : 檢測失效的服務,將不會再去命中失效的服務
Ribbon的主要組件: ServerList、IRule、ServerListFilter等
Ribbon流程 : 經過ServerList獲取全部可用服務列表,而後經過ServerListFilter過濾一部分服務, 最後使用IRule選擇一個目標
查看Ribbon的源碼,發現ServerList方法是過期的,使用另外一個getAllServers方法
IRule默認的命中方式是天然順序的方式,若是想改變方式能夠,參考官網的文檔以下:
那麼咱們在yml中加入以下配置: 隨機方式(其餘方式能夠在實現IRule接口的方法中查找,路徑須寫全)
PRODUCT: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
文檔能夠找中文的,也能夠看官方英文的,看本身愛好,耐心很重要,url: spring.io
本篇不記錄更多了,一段一段消化,下篇再繼續Feign的學習
------------------------------------------------------------