day02-專案搭建+consul

yuqiu2004發表於2024-07-07

1 RestTemplate

RestTemplate提供了多種便捷訪問遠端Http服務的方法,

是一種簡單便捷的訪問restful服務模板類,是Spring提供的用於訪問Rest服務的客戶端模板工具集

官網地址:https://docs.spring.io/spring-framework/docs/6.0.11/javadoc-api/org/springframework/web/client/RestTemplate.html

常用介面:

  • getForObject:返回物件為響應體中資料轉化成的物件,基本上可以理解為Json

  • getForEntity:返回物件為ResponseEntity物件,包含了響應中的一些重要資訊,比如響應頭、響應狀態碼、響應體等

  • postForObject

  • postForEntity

GET請求方法:

<T> T getForObject(String url, Class responseType, Object... uriVariables);

<T> T getForObject(String url, Class responseType, Map<String, ?> uriVariables);

<T> T getForObject(URI url, Class responseType);

<T> ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables);

<T> ResponseEntity getForEntity(String url, Class responseType, Map<String, ?> uriVariables);

<T> ResponseEntity getForEntity(URI var1, Class responseType);

POST請求方法:

<T> T postForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables);

<T> T postForObject(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

<T> T postForObject(URI url, @Nullable Object request, Class responseType);

<T> ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object... uriVariables);

<T> ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

<T> ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType);

透過容器注入編寫配置類:

@Configuration
public class RestTemplateConfig
{
    @Bean
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

2 Idea中調整Java語法版本

project structure -> modules -> sources -> language level

3 Consul

  1. 為什麼要使用consul

    微服務所在的IP地址和埠號硬編碼存在非常多的問題:IP和埠變化、無法實現負載均衡、維護複雜

    應該怎麼做:服務名固定,路徑不固定

  2. 什麼是Consul

    開源的分散式服務發現與配置管理系統,由HashiCorp公司用Go語言開發

  3. consul安裝、下載和執行

    • 下載:http://consul.io -> downloads -> 選擇相應的版本
    • 安裝:解壓即可
    • 執行:在根路徑下輸入命令consul agent -dev
    • 驗證:訪問http://localhost:8500
  4. 註冊

    1. 啟動consul

    2. 新增依賴如下

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-consul-discovery</artifactId>
      	<exclusions>
      		<exclusion>
      			<groupId>commons-logging</groupId>
      			<artifactId>commons-logging</artifactId>//用於排除衝突提示
      		</exclusion>
      	</exclusions>
      </dependency>
      
    3. 修改配置

      spring:
        application:
          name: cloud-consumer-order
        ####Spring Cloud Consul for Service Discovery
        cloud:
          consul:
            host: localhost
            port: 8500
            discovery:
              service-name: ${spring.application.name}
              prefer-ip-address: true #優先使用服務ip進行註冊
      
    4. 在RestTemplateConfig的方法上新增負載均衡的註解

      @Configuration
      public class RestTemplateConfig
      {
          @Bean
          @LoadBalanced // 開啟負載均衡
          public RestTemplate restTemplate()
          {
              return new RestTemplate();
          }
      }
      

4 三個註冊中心的異同點

前置概念 | 評判標準:CAP,即Consistency強一致性、Availability可用性、Partition tolerance分割槽容錯性

  • AP架構(Eureka)

    • 當網路分割槽出現後,為了保證可用性,系統B可以返回舊值,保證系統的可用性。

    • 當資料出現不一致時,雖然A, B上的註冊資訊不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務資訊時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性結論:違背了一致性C的要求,只滿足可用性和分割槽容錯,即AP

  • CP架構(Zookeeper/Consul)

    • 當網路分割槽出現後,為了保證一致性,就必須拒接請求,否則無法保證一致性,Consul 遵循CAP原理中的CP原則,保證了強一致性和分割槽容錯性,且使用的是Raft演算法,比zookeeper使用的Paxos演算法更加簡單。雖然保證了強一致性,但是可用性就相應下降了,例如服務註冊的時間會稍長一些,因為 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認為註冊成功 ;在leader掛掉了之後,重新選舉出leader之前會導致Consul 服務不可用。結論:違背了可用性A的要求,只滿足一致性和分割槽容錯,即CP

Eureka只能進行服務註冊,而Consul不僅可以註冊還可以分散式配置

5 consul分散式配置

  1. 新增依賴

    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-config</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>commons-logging</groupId>
                        <artifactId>commons-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
            </dependency>
    
  2. 新增配置 bootstrap.yml

    • 區別:

      • application.yml 使用者級的資源配置項
      • bootstrap.yml 系統級的 優先順序更高
    • spring:
        application:
          name: cloud-payment-service
        ####Spring Cloud Consul for Service Discovery
        cloud:
          consul:
            host: localhost
            port: 8500
            discovery:
              service-name: ${spring.application.name}
            config:
              profile-separator: '-' # default value is ','
              format: yaml
      
    • 將相關內容從application.yml中刪去

  3. Consul新增配置

    1. Kay/Value 下建立資料夾config(建立時以/結尾識別為資料夾),然後建立三個子資料夾**-prod、**-dev、**分別表示釋出環境、開發環境、預設環境,**表示服務名
    2. 接著在各個子資料夾中新增data配置檔案 配置相關資訊

相關文章