SpringCloud与Springboot版本对应
Spring Cloud 2020.0.0发布 再见了Netflix
简单一句话概括:Spring Cloud 2020.0.0版本彻底删除掉了Netflix除Eureka外的所有组件。
Release Train 发布时间 Spring Boot版本 SC Commons版本 2020.0.x 2020-12 2.4.x 3.0.0 Hoxton 2019-07 2.2.x, 2.3.x (从SR5起) 2.2.x Greenwich 2018-11 2.1.x 2.1.x Finchley 2017-10 2.0.x 2.0.x Edgware 2017-08 1.5.x 1.3.x Dalston 2017-05 1.5.x 1.2.x Brixton 2016-09 1.3.x 1.1.x Angel 2016-05 1.2.x 1.0.x
一、搭建Eureka服务(Eureka Server)
1.1、基础知识
微服务架构往往是相对于比较庞大的,复杂的工程。要建立微服务,首先要先建立好对应的微服务模块,也要建立一系列的基础设施与组件。
用于进行服务发现与注册。
是Netflix的一个组件,只需要使用服务的标识符就能够进行访问服务了,而不需要去修改服务的配置文件,其他的客户端可以使用Eurake client来进行连接服务端。
为什么需要服务注册与发现?
IP变化
难以维护。例如服务之间调用,可能会互相进行远程调用接口,那么对应指定要调用的服务端口或ip地址发生改变那么就需要重新修改配置文件等等,此时我们就通过服务注册发现来进行对服务的统一管理。
改进,一般每个服务都会有对应的节点,有对应的消费者与服务者。首先消费者与服务者都在服务中心进行注册,之后消费者需要进行消费服务也都会通过服务中心进行。
架构
服务消费者、生产者都需要在Eureka Server上进行注册。服务者可以进行续约、取消操作
下面是Eureka的架构图,Eureka Server可以有多个节点,防止一个宕机服务就无法提供,不同的客户端可以向Server进行远程调用请求等等操作
1.2、开发一个Eureka Server服务
引入依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- SpringCloud指定版本 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR5</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 这里eureka-server依赖不需要指定版本,它会自动根据上面spring-cloud的对应版本依赖中去找 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
yaml配置文件编写:
server: port: 8000 spring: application: name: eureka-server eureka: instance: hostname: localhost client: fetch-registry: false #fetch-registry:获取注册表。不需要同步其他节点数据。(当前没有建立eureka server集群,这里不需要同步节点) register-with-eureka: false # 代表是否将自己也注册到Eureka Server,这里不注册 service-url: # 设置服务的地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
最终在springboot启动类上添加启动注解:
@EnableEurekaServer //Eureka Server服务端
运行项目:http://localhost:8000/
可以看到当前没有实例被注册,该页面是Eureka服务管理界面,下面包含了对应的相关信息等。
我们可以看一下当配置文件中register-with-eureka: true设置为默认值true时,可以看到自己也会被注册到服务中心上去:
额外:Eurake Server整合Springboot版本问题
上面案例使用的springcloud的版本依赖(Greenwich.SR5)只能配对较低版本的springboot,若是配对springboot2.4.5就会报各种各样的错误,想要兼容2.4.5则需要引入对应其他版本的springcloud依赖,如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2020.0.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
已经测试可以兼容springboot2.4.5,对应2020.0.2是今年出的springcloud依赖版本!
注意:springcloud中2020.0.2版本里的Hystrix已经被替代掉了,建议学习使用的springcloud版本为上面green的。
二、服务改造(Eureka Client)
原本服务改造(实现注册)
①将原本提供的单个服务进行改造,引入对应的client依赖。
<!-- Eureka-client:进行注册到服务中心 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 父模块声明即可,之后上面的依赖就会根据其进行导入 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR5</version> <type>pom</type> <scope>import</scope> </dependency>
②配置文件中进行配置client地址
# 指定注册的服务中心地址,一般与eureka-server中配置的对应,此时该服务启动就会将自己注册到服务中心 eureka: client: service-url: defaultZone: http://localhost:8000/eureka/
启动项目效果:对应的client服务就会自动连接注册到服务中心去
注意其中的application名称如果你不在yaml配置文件配置spring.application.name的话就会像上面一样为UNKNOEW,下面是配置好了的:
其他的服务也是如何进行配置!
老的版本对应client服务需要加上注解@EnableEurekaClient,实际上不加也是ok的,原因就是我们依赖的是比较高级的依赖,如starter-netflix-eureka-client,所以可省略该注解。
之后让两个模块实现调用
三、Feign(远程调用)
3.1、Feign历史介绍
早期叫做Open Feign,早期叫做netflix-feign,netflix是最早开发以及维护feign的公司,后来将这个组件捐献出去了,就给到springcloud团队。其团队拿到netflix-feign之后在其基础上进行开发升级,之后才更改为open-feign.
声明式的模板式的HTTP客户端,若是我们在springcloud中使用这个组件能够非常方便的调用http的远程请求,调用远程方法如调用本地方法一样简单,基于接口与注解的方式实现的。
左边生产者提供服务的,首先进行注册,接着从注册中心将所有的服务地址拉取下来,接着consumer利用一定的算法(Ribbin)做负载均衡来去调用服务端
不利用feign需要手写http请求,包括去传入参数、请求头、cookie这一系列的工作,需要配置一系列之后才能够发送请求十分繁琐,而使用feign之后调用远程方法就像是调用本地方法一样容易
3.2、springboot服务集成Feign
集成过程及思路
前提:你需要先搭建eureka server服务接着还要进行调用的服务改造为client,确保多个服务能够被注册到服务中心上去之后我们才能够进行下面的步骤来进行远程调用!
步骤:
1、引入依赖:
<!-- 远程调用:feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- SpringCloud指定版本 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR5</version> <type>pom</type> <scope>import</scope> </dependency>
2、启动类上标注开启注解
@EnableFeignClients //开启远程调用
3、引入对应要调用的服务包依赖(若是对应的接口方法中使用到对应包中的一些类,则需要引入依赖)
4、创建client目录,添加client接口
/** * @ClassName CourseListClient * @Author ChangLu * @Date 2021/10/4 16:36 * @Description TODO */ @FeignClient("course-list") //对应服务中心的application,也就是对应的服务配置进行声明spring.application.name=course-list public interface CourseListClient { @GetMapping("/course/list") //对应该接口的url路径 Object getList(); //对应controller方法,建议就是直接把原本的controller方法拿过来即可,把方法体和public去掉即可!!! }
OK,准备步骤完成,我们来在该配置的服务中进行调用使用
@RestController @RequestMapping("/courseprice") public class CoursePriceController { //同样通过Spring的依赖注入,将动态代理类注入进来 @Autowired private CourseListClient courseListClient; @GetMapping("/test") public Object testFeignCourseService(){ //进行调用远程方法,真的就像调用本地方法一样!!!不再需要自己指定url路径、请求体、参数一系列东西,两个字舒服!!! return courseListClient.getList(); } }
测试一下,调用另外一个模块成功:
思考
本质:远程调用其实本质同样就是发送http请求,传送的对象最终会解析成消息体。
最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。
好处:省去了我们编写 HTTP 连接,数据解析获取等一系列繁琐的操作。