手把手教你將Eureka升級Nacos註冊中心

2023-02-08 12:02:50

  由於原有SpringCloud體系版本比較老,最初的註冊中心使用的Eureka後期官方無升級方案,設定中心無法線上管理設定,還有實時上下線的問題,因此需要將原有系統的Eureka服務升級Nacos註冊心服務。

原有版本SpringBoot1.5.15、SpringCloud E、註冊中心Eureka

升級後版本SpringBoot2.1.6、SpringCloud G、註冊中心Nacos1.4.2

1.升級springboot為2.x

註釋掉根目錄下的parent,和starter依賴。

 新增dependencyManagement的springboot依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring-boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

新增打包資源

 

<resources>
    <!--如果不設定resource 會導致application.yml中的@@找不到pom檔案中的設定-->
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

2.升級springcloud版本到Greenwich.SR2

使用Undertow 替換內建 Tomcat;

<!--使用Undertow 替換內建 Tomcat-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

新增Nacos設定:

<!--阿里巴巴 nacos 服務發現-->
<!--註冊中心-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>${spring-cloud-alibaba.version}</version>
</dependency>
<!--設定中心-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>${spring-cloud-alibaba.version}</version>
</dependency>

 新增監控相關參照

<!--組態檔處理器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<!--監控-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

升級Feign參照

<!--宣告式介面呼叫-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 SpringbootApplication啟動項中更新為

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class JoinDerepeatApplication {

}

4.更改組態檔bootstrap.yml

根據自身服務更改下面內容,${nacos-namespace:}這種寫法是為了執行時可以由外部環境變數傳入,而不用更改設定重新打包釋出。

server:
  port: 8123
  undertow:
    worker-threads: 1000
    io-threads: 32
    accesslog:
      enabled: true
      dir: /logs/${spring.application.name}
      pattern: '%t,${spring.application.name},%a,%A:%p,"%r",%s,%T,%b,%{i,Referer},"%{i,User-Agent}"'

spring:
  application:
    name: join-derepeat
  profiles:
    active: ${active:dev}
  cloud:
    #手動設定Bus id,
    bus:
      id: ${spring.application.name}:${server.port}
  main:
    allow-bean-definition-overriding: true
  #解決restful 404錯誤 spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
  mvc:
    throw-exception-if-no-handler-found: true
  resources:
    add-mappings: false

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS

#解決讀取組態檔中文亂碼
file:
  encoding: utf-8

---
spring:
  profiles: dev
  cloud:
    inetutils:
      preferred-networks: 10.2
    nacos:
      config:
        namespace:
        server-addr: 10.3.87.30:3105
        shared-configs[0]:
          data-id: common.properties
##          refresh: true
        shared-configs[1]:
          data-id: rabbitmq.properties
      discovery:
        namespace:
        server-addr: 10.3.87.30:3105
        metadata:
          version: ${project.version}
          description: ${project.description}
---
spring:
  profiles: prd
  cloud:
    nacos:
      config:
        namespace: ${nacos-namespace:}
        server-addr: ${config-server-addr}
        shared-configs[0]:
          data-id: common.properties
    ##          refresh: true
        shared-configs[1]:
          data-id: rabbitmq.properties
      discovery:
        namespace: ${nacos-namespace:}
        server-addr: ${discovery-server-addr}
        metadata:
          version: ${project.version}
          description: ${project.description}

5.組態檔

埠自定義,測試與正式環境設定shared-configs[0]  common.properties 本專案需要載入的組態檔內容儲存在Nacos中心。

refresh: true 設定為可以實時動態更新的組態檔

 

設定內容範例

 

可以新增自已的組態檔 如新增join-derepeat.yml。

只需要繼續新增自己的組態檔shared-configs[2]設定即可。

最後啟動本服務

存取介面頁面http://localhost:8123/doc.html 偵錯即可。

6.Swagger-UI更換

<swagger2.version>2.9.0</swagger2.version>
<swagger-bootstrap-ui.version>1.9.5</swagger-bootstrap-ui.version>
<!--swagger-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>${swagger2.version}</version>
</dependency>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>${swagger-bootstrap-ui.version}</version>
</dependency>

 

在config資料夾內新增SwaggerConfig檔案

將如下高亮更新為自己的程式內容

@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class SwaggerConfig {
    //swagger2的組態檔,這裡可以設定swagger2的一些基本的內容,比如掃描的包等等
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("資料去重複")
                .select()
                //為當前包路徑
                .apis(RequestHandlerSelectors.basePackage("com.join.derepeat.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    //構建 api檔案的詳細資訊函數,注意這裡的註解除參照的是哪個
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //頁面標題
                .title("資料去重複 API")
                //建立人
                .contact(new Contact("james", "", ""))
                //版本號
                .version("1.0")
                //描述
                .description("重複資料攔截")
                .build();
    }
}

7.更改映象打包pom檔案

由於是採用Docker部署,因此需要打成docker映象,使用的是docker-maven-plugin外掛。

新增容器倉庫地址

<docker.repostory>10.3.87.5:8080</docker.repostory>

新增

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.1.1</version>
                <configuration>
                    <!--覆蓋相同標籤映象-->
                    <forceTags>true</forceTags>
                    <!-- 與maven組態檔settings.xml一致 -->
                    <serverId>nexus-releases</serverId>
                    <!--私有倉庫地址 -->
                    <registryUrl>https://${docker.repostory}</registryUrl>
                    <!--遠端Docker地址 -->
                    <dockerHost>http://10.3.87.21:2345</dockerHost>
                    <!-- 注意imageName一定要是符合正則[a-z0-9-_.]的,否則構建不會成功 -->
                    <!--指定映象名稱 倉庫/映象名:標籤-->
                    <imageName>${docker.repostory}/${project.name}:${project.version}</imageName>
                    <baseImage>join:0.6</baseImage>
                    <maintainer>${project.description} admin</maintainer>
                    <env>
                     <JAVA_OPTS>
                     -Xms700m -Xmx700m
                     </JAVA_OPTS>
                    </env>
                    <cmd>java $JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/${project.build.finalName}-dump.hprof -jar /app/${project.build.finalName}.jar</cmd>
                    <resources>
                        <resource>
                            <!-- 指定要複製的目錄路徑,這裡是當前目錄 -->
                            <!-- 將打包檔案放入dockerDirectory指定的位置 -->
                            <targetPath>/app/</targetPath>
                            <!-- 指定要複製的根目錄,這裡是target目錄 -->
                            <directory>${project.build.directory}</directory>
                            <!-- 指定需要拷貝的檔案,這裡指最後生成的jar包 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

小技巧:這裡將jar執行時設定的引數變數化<JAVA_OPTS>,方便在不重新編譯的情況下快速通過設定環境變數的方式新增一些想要的值。

以上就是在實戰中總結出來的設定經驗。