由于原有SpringCloud体系版本比较老,最初的注册中心使用的Eureka后期官方无升级方案,配置中心无法在线管理配置,还有实时上下线的问题,因此需要将原有系统的Eureka服务升级Nacos注册心服务。

原有版本SpringBoot1.5.15、SpringCloud E、注册中心Eureka

升级后版本SpringBoot2.1.6、SpringCloud G、注册中心Nacos1.4.2

1.升级springboot为2.x

注释掉根目录下的parent,和starter依赖。

手把手教你将Eureka升级Nacos注册中心

注释掉dependencyManagement下的platform-bom

手把手教你将Eureka升级Nacos注册中心

添加dependencyManagement的springboot依赖

手把手教你将Eureka升级Nacos注册中心

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

添加打包资源

手把手教你将Eureka升级Nacos注册中心

<resources>
    <!--如果不设置resource 会导致application.yml中的@@找不到pom文件中的配置-->
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

2.升级springcloud版本到Greenwich.SR2

手把手教你将Eureka升级Nacos注册中心

并添加alibaba.cloud版本

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

3.替换掉Eureka注册中心与配置中心

手把手教你将Eureka升级Nacos注册中心

使用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 设置为可以实时动态更新的配置文件

手把手教你将Eureka升级Nacos注册中心

配置内容示例

手把手教你将Eureka升级Nacos注册中心

可以添加自已的配置文件如添加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>,方便在不重新编译的情况下快速通过设置环境变量的方式添加一些想要的值。

以上就是在实战中总结出来的配置经验。