SpringCloud 微服務 (六) 服務通訊 RestTemplate

通訊的方式主要有兩種,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的學習

------------------------------------------------------------

相關文章
相關標籤/搜索