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

歡醉發表於2023-02-08

  由於原有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下的platform-bom

 

 新增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

並新增alibaba.cloud版本

<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>

3.替換掉Eureka註冊中心與配置中心

使用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>,方便在不重新編譯的情況下快速透過設定環境變數的方式新增一些想要的值。

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

 

相關文章