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

  由於原有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>,方便在不重新編譯的情況下快速通過設置環境變量的方式添加一些想要的值。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章