SpringCloud實踐引入注冊中心+配置中心


  隨着服務數量的增多,尤其是多數項目涉及jni本地方法的調用,所需參數配置較多,同時內存溢出等維護問題時常發生.鑒於此,原tomcat集群的使用已難滿足需求,而微服務的思想契合當前項目實踐,特在服務端構建起高可用eureka_server注冊中心集群/config_server配置中心集群,完成對應用和git配置文件的管理.同時考慮到服務器集群並發清洗數據的必要性,構建起了ribbon+zuul負載均衡集群(后續完成)並在實踐中效果顯著.整體而言,微服務的引用改善了項目開發和日常維護/迭代過程紛亂的現狀.特整理注冊中心和配置中心構建過程博客如下:

  一 . 環境一覽:

  •   開發系統:Ubuntu 16.04 生產/測試系統:Cent OS 6
  •        版本: SpringBoot 1.5.19 + SpringCloud Edgware.SR5 (idea構建自動匹配) + JDK 1.8

  二 . 注冊中心:

  1.構建maven父工程 (便於開發環境項目管理),默認即可.

  2.新建注冊中心模塊

  new Module -> Spring Initializr --- Module SDK: 1.8 + Initializr Service URL - Default

            -> Project Metadata:完成Group + Artifact + Version + Package的配置

         -> Dependencies:

          -> SpringBoot - 1.5.19

          -> Cloud Discovery - Eureka Server

           -> Finish

  構建過程基於 IDEA新建Maven模塊流程

  3.啟動類配置:

  新增 @EnableEurekaServer 注解即可.

@EnableEurekaServer
@SpringBootApplication
public class RosettaEurekaServer1Application {

    public static void main( String[] args ) {

        SpringApplication.run(RosettaEurekaServer1Application.class,args);
    }
   
}

  4.應用配置:

  注意:此處構建為 eureka_server 集群 , 故而開發對自身的注冊(單實例設置為false即可),同時默認注冊中心為另一實例路徑,具體配置如下: 

server:
  port: 8761
eureka:
  client:
    register-with-eureka: true # Eureka Server向自己注冊
    fetch-registry: true
    service-url:
      defaultZone:
        http://127.0.0.1:8762/eureka
  server:
    enable-self-preservation: false
    wait-time-in-ms-when-sync-empty: 0
spring:
  application:
    name: resetta_eureka_server
  jackson:
    time-zone: GMT+8

  5.同上,構建另一eureka注冊中心實例

  結合4,配置如下 ( 注意: 實例名相同 ):

server:
  port: 8762
eureka:
  client:
    register-with-eureka: true 
    fetch-registry: true
    service-url:
      defaultZone:
        http://127.0.0.1:8761/eureka
  server:
    enable-self-preservation: false
    wait-time-in-ms-when-sync-empty: 0
spring:
  application:
    name: resetta_eureka_server
  jackson:
    time-zone: GMT+8

  6.構建 eureka_client 測試

  1) 新建 eureka_client 模塊:

  同 二 - 2 , 只在 pom依賴環節改動如下:

   Dependencies:

      -> Spring Boot - 1.5.19

      -> Cloud Discovery - Eureka Discovery

   Finish

  2) 啟動類配置:  

  新增 @EnableDiscoveryClient 注解

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientTestApplication.class, args);
    }

}

  3) 應用配置:

  注意:因由多個注冊中心,故在配置時指定多個實例,具體如下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka, http://127.0.0.1:8762/eureka
server:
  port: 8777
spring:
  application:
    name: eureka_client
  cloud:
    config:
      allow-override: true
      override-system-properties: false
# 在eureka集群中,需注意關閉安全組件
management:
  security:
    enabled: false

  7.依次啟動注冊中心/測試實例

  注:idea有一好用的實例啟動視圖 - RunDashbord . 如果實例啟動未加載至該視圖 , 可做以下修改

    a. 找到項目根目錄下 .idea - workspace.xml 配置文件

    b. 找到文件夾下的 RunDashboard 組件, 設置 配置類型( configurationTypes )為 ( SpringBootApplicationConfigurationType ) 

    c. 最終該組件配置如下:

<component name="RunDashboard">
    <option name="configurationTypes">
      <set>
        <option value="SpringBootApplicationConfigurationType" />
      </set>
    </option>
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
</component>

    d.Run Dashboard 視圖啟動效果如下:

  項目啟動完畢后,進入 localhost:8761 / localhost:8762 查看各實例運行狀態,截圖如下:

  三 . 配置中心

  配置中心的構建,有些分歧,這里暫提供行之有效的終版也是簡略版.

  1. 基於 二 中 maven 父工程 , 新建配置中心 模塊

  同 二 - 2 , 只在 pom依賴環節改動如下:

    Dependencies:

      -> Spring Boot - 1.5.19

      -> Cloud Config - Config Server

      -> Cloud Discovery - Eureka Discovery

  2. 啟動類配置

  新增 @EnableConfigServer / @EnableEurekaClient 注解 : 

@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class RosettaConfigServer1Application {

    public static void main(String[] args) {
        SpringApplication.run(RosettaConfigServer1Application.class, args);
    }

}

  3. 應用配置

eureka:
  client:
    service-url:
      defaultZone: http://172.18.28.100:8761/eureka, http://172.18.28.100:8762/eureka
server:
  port: 8768
spring:
  application:
    name: rosetta_config_server
  cloud:
    config:
      server:
        git:
          uri: git@*.*.*.*:~/git/rosetta_cloud_config.git # 管理配置文件git服務器端路徑
          search-paths: test # 對應的配置文件路徑
          username: git
          password: 123456
      label: master # 分支

  4. 構建配置中心另一實例

  同 3 , 除 端口不同

  5. 啟動測試 , 及 git服務端配置文件命名規約

  Configuration Server 端點與配置文件的映射規則如下:

/{applicaiton}/{profile}[/{label}]
/{appllication}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

  啟動配置中心實例,根據上述規約測試配置信息如下:

 

  6. Config Client 的使用

  1) 根據 二 中 maven 父工程 , 新建配置客戶端 模塊:

  pom依賴方面, 因需要時常刷新配置,故需采用 config client 結合 actuator的 /refresh的使用方式.依賴如下:

    Dependencies:

      Spring Boot - 1.5.19

      Cloud Config - Config Client

      Cloud Discovery - Eureka Discovery

      Ops - Actuator 

  2) 啟動類配置:        

     此處只需保留 @EnableEurekaClient 即可 

  3) 啟動配置:

  application.yml

  management.security.enabled 置為 false , 免去調用/refresh時的權限驗證

eureka:
  client:
    service-url:
      defaultZone: http://172.18.28.100:8761/eureka, http://172.18.28.100:8762/eureka
spring:
  application:
    name: test-config
server:
  port: 8771
management:
  security:
    enabled: false

  bootstrap.yml

spring:
  cloud:
    config:
      fail-fast: true
      label: master
      profile: dev
      discovery:
        enabled: true
        service-id: rosetta_config_server

  4). 配置文件類:

@Component
@ConfigurationProperties(prefix = "test")
@RefreshScope
public class PersonConfigRemote {

    private String husband;
    private String wife;

    public String getHusband() {
        return husband;
    }

    public void setHusband(String husband) {
        this.husband = husband;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }
}

  5) 接口測試:

@RestController
@RequestMapping("/test")
public class TestConfig {

    @Autowired
    private PersonConfigRemote personConfigRemote;

    @GetMapping
    public String test(){
        return personConfigRemote.getHusband() + " --- " + personConfigRemote.getWife();
    }

}

  6) 配置信息刷新

  Spring提供了@ConfigurationProperties注解,可以將配置屬性映射到一個JavaBean ,  而且 Actuator 導出 /refresh 服務 , 每當調用這個服務的時候,被@ConfigurationProperties標注的Bean就會刷新屬性值 .

  注 : /refresh 為 POST 請求.

  7) 測試 

  7. 追加

  關於 Spring Cloud Bus + rabbit mq 

  新增pom:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

  應用配置如下:

spring:
  application:
    name: rosetta_config_server
  cloud:
    bus:
      trace:
        enabled: true # 開啟cloud bus的跟蹤
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
management:
  security:
    enabled: false

  rabbit mq 安裝使用 : 

  docker -> rabbit mq

docker pull rabbitmq:3-management
docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

參數說明:
-d 后台進程運行
hostname RabbitMQ主機名稱
name 容器名稱
-p port:port 本地端口:容器端口
-p 15672:15672 http訪問端口
-p 5672:5672 amqp訪問端口

  注:映射2個端口:15672是Web管理界面的端口;5672是MQ訪問的端口。

  實際應用中,調用 Config Client實例的 /bus/refresh 端點 , 注意 : POST 請求


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM