SpringBoot&SpringCloud升级踩坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot&SpringCloud升级踩坑相关的知识,希望对你有一定的参考价值。

参考技术A 最近遇到了一个项目,需求是升级springboot版本。项目用到了很多组件,redis、Apollo、zipkin以及SpringCloud的一套组件。升级过程踩了很多坑,我把自己遇到的问题整理了一下供大家学习交流。

SpringBoot 1.4.2 ——> 2.3.2
SpringCloud 1.3.1 ——>Hoxton.SR6
jedis 2.8.2 ——>3.3.0
Zipkin的版本仍然使用11.2.0.4的,没有做升级
Apollo-client也没有做升级,使用的是1.6.0的版本

首先,确保SpringBoot和SpringCloud版本对应起来。
在SpringBoot2.x之后的SpringCloud的依赖有一些变化
SpringBoot2.x之前

SpringBoot2.x之后

SpringCloud获取eureka实例的参数改变了
升级前:

升级后:

我们可以看到源码上注释说,这两个方法在3.0之后不用了。如果我们自己写了dataSource就需要做出相应的修改。
jedis3.0之前的实现方式

jedis之后我们的实现方式

可能是spring热部署的配置没有关闭

如果之前的项目没有这个问题,那我们加一个配置把重复的bean覆盖掉就好了

微服务SpringCloud之服务注册与发现

   在找.net core 微服务框架时发现了Steeltoe开源项目,它可以基于Spring Cloud实现.net core和.net  Framework的微服务。正好之前也有学习过SpringBoot,而Spring Cloud是基于SpringBoot的,有了SpringBoot基础上手入门SpringCloud应该也不难,正好我的第一本书<<Spring快速入门>>即将上架,感兴趣的朋友可以多多支持。本篇主要学习服务注册与发现组件Eureka。

   在学习之前首先聊一聊为什么会有微服务,它的优缺点是什么。

   在微服务之前主要是单体应用,单体应用常见的就是一个war文件包含所有功能的应用程序包,每次迭代更新哪怕是更新一行代码都需要重新打包部署,同样每次迭代可能都要进行测试,模块与模块之间耦合度也比较高,导致可能需要对整个war包进行的测试,如果出现一个bug导致内存溢出,死循环,可能导致整个应用崩溃。二八原则在日常生活中普遍存在,在软件领域也一样,我们平时浏览网页一般读的多,写的少,例如逛博客园,我们可能浏览的比较多,提交数据的频率比较少,在单体应用中如果要增加浏览接口的部署,同样也会将提交数据的接口部署上去会造成资源浪费,单体应用往往使用统一的技术平台或方案解决所有的问题,开发语言和框架固定之后后续想引入新框架和技术也比较困难。

   在单体应用中主要是面对单个应用的编程,而在微服务中主要是面对单个功能点的编程,将提供的功能点对外发布,这样其他地方可以不用关心具体用什么语言什么技术实现的,直接调用即可。而且每个功能点可以独立部署,是解耦的。假如某个接口调用增多,可以单独部署该接口应用,扩展性比较好。某个节点出现故障可以迅速让其他节点顶上,不至于整个应用不可用,容错性好,某个服务访问超出服务器承载时也可以进行限流,后续的CI、CD容器化也比较方便。同样有优点也有缺点,微服务会导致对外提供的接口增多,部署数量增多,服务治理带来新的挑战,A服务会调用B服务,B服务会调用C服务,如果A服务报错了,那是A服务导致的还是B、C服务导致的呢,而且对外提供服务的节点可能会有很多,那是哪个服务的哪个节点导致的呢?所以还需要微服务的链路追踪与排查。前面也提到微服务方便扩展,那什么情况下需要扩展,哪些服务节点需要扩展,这需要用数据说话,那就需要对服务进行监控,而且监控的参数指标和维度也是不一样的。

  前面算是导语,下面切回正题,来学习服务注册与发现组件Eureka。每个站点都对外提供某些服务,有点类似家里赶集一样,有的卖家说卖衣服的,提供卖衣服的接口,有的卖家是卖拖拉机的,提供卖拖拉机的接口,每个卖家都是独立分散的,假如每个卖家都不在一个集市上,那买家可能需要先找到每个卖家住在什么地方,哪个村的叫什么名字,一般逛一家可能还没选到合适的,还要多逛几家,这样买家就要来回跑,那有了集市之后就不一样了,每个卖家都在集市上提供不同的服务,买家只要到固定的集市上找需要的服务即可,就和在没出现淘宝之前买东西需要到实体商店,有了淘宝之后只要输入淘宝网址就能找到不同商家提供的不同服务。Eureka就是有点类似淘宝的功能,它为服务提供者(卖家)提供了一个集中的平台,只要注册一下说明提供什么服务,服务消费者(买家)不用关心服务提供者在什么地方,直接调用就好了,是一个中心化的过程。

一、创建Eureka Server

1.引入依赖

   SpringCloud使用Eureka也比较容易,创建SpringBoot项目时选中Eureka Server即可,它会在pom.xml中自动引入下面两个依赖,也可以自己添加。

技术图片
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
View Code

2、启动代码中添加@EnableEurekaServer注解

技术图片
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication 

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

View Code

3、配置文件

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,在application.properties添加以下配置:

spring.application.name=spring-cloud-eureka
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:$server.port/eureka/
server.port=8088

eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。

4.启动应用

在浏览器输入http://localhost:8088/,即可看到下面页面,暂时还未有注册的实例。

技术图片

二、Eureka集群

这里使用两个节点来构建Eureka注册中心,首先添加两个配置文件application-peer1.properties、application-peer2.properties.分别启动了8000、8001端口。同时

eureka.client.serviceUrl.defaultZone为对方的地址。

application-peer1.properties:

spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/

application-peer2.properties:

spring.application.name=spring-cloud-eureka
server.port=8001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

application.properties:

spring.application.name=spring-cloud-eureka
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

将Eureka Server项目打包,mvn clean package,会生成EurekaServer-0.0.1-SNAPSHOT.jar包。

技术图片

在EurekaServer-0.0.1-SNAPSHOT.jar的目录下,分别执行下面两句命令,启动两个EurekaServer实例。

java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

 技术图片

然后在浏览器中输入http://localhost:8001/http://localhost:8000/就会发现你中有我我中有你。这里也都是参考纯洁的微笑大神的:http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html。在里面介绍说注册中心会出现在available-replicas中,但我这边的测试并未在available-replicas中,看它的评论里也有一些也是未出现在available-replicas中,这个地方可能还要再留意一下。

技术图片

技术图片

三、创建Eureka Client

1、引入依赖

这里先创建个服务提供者,也就是生产者。在创建时选中Eureka Client,项目会自动引入下面的spring-cloud-starter-netflix-eureka-client依赖。由于要提供服务,所以这里又引入了spring-boot-starter-web。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、启动代码中添加@EnableDiscoveryClient注解

与上面添加@EnableEurekaServer类似,这里添加@EnableDiscoveryClient注解。

3.配置文件

这里提供配置了eureka交互地址,这里为两个,将服务注册到eureka两个实例中。

spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/,http://localhost:8001/eureka/

4.增加服务HelloController

技术图片
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController 
    @RequestMapping("/hello")
    public String index(@RequestParam String name) 
        return "hello "+name+",this is first messge";
    
View Code

5.启动应用就可在http://localhost:8000/http://localhost:8001/中看到最近注册到Eureka的实例spring-cloud-producer。

技术图片

 

技术图片

 四、小结

本篇主要了解了下什么是Eureka,它的作用,以及如何使用。主要学习Eureka服务端的配置和双节点配置,将Eureka client注册到Eureka server中,后续就是要学习如何调用生产者提供的服务了。

最后再推荐下我的新书<<spring 快速入门>>,个人认为对与Spring初学者来说还是值得一读的,虽然之前也没有过Java的工作经验,写这本书的过程也是我二次复习巩固Spring的过程,我也是以初学者的角度来完成这本书的。本书目录在前面的博客中,可以点击查看

 

以上是关于SpringBoot&SpringCloud升级踩坑的主要内容,如果未能解决你的问题,请参考以下文章

基于Java+SpringBoot+Vue+uniapp前后端分离图书阅读系统设计与实现

##走过路过不容错过之##JavaEE 框架篇一 Spring

Spring Cloud 概述

springcloud—— 网关服务Gateway

springcloud—— 网关服务Gateway

# SpringCloud 服务治理实现(Consul)