SpringCloud-2020.0.3版本简单入门
Spring Cloud 2020.0.0版本北京时间2020.12.22发布,彻底删除掉了Netflix除Eureka外的所有组件,支持SpringBoot2.4.x
Netflix 组件替代方案(Feign依旧是可以使用的,OpenFiegn,做REST客户端)
Netflix | 推荐替代品 | 说明 |
---|---|---|
Hystrix | Resilience4j | Hystrix自己也推荐你使用它代替自己 |
Hystrix Dashboard / Turbine | Micrometer + Monitoring System | 监控这件事交给更专业的组件去做 |
Ribbon | Spring Cloud Loadbalancer | Spring终究亲自出手 |
Zuul 1 | Spring Cloud Gateway | Spring终究亲自出手 |
Archaius 1 | Spring Boot外部化配置 + Spring Cloud配置 | 比Netflix实现的更好、更强大 |
这里我简单记录了一下SpringCloud2020.0.3版本的情况,作为学习供以后参考,以后SpringCloud会使用SpringCloud Alibaba的。
Eureka服务注册与发现
一、概述
1、CAP原则
CAP原则又称CAP定理,指的是在一个分布式系统中一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。但这三个要素最多只能同时实现两点,不可能三者兼顾,一般来说是AP和CP。
2、Eureka介绍
Eureka是一个基于REST的服务,用于定位服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册与发现功能。功能类似于Dubbo的注册中心,比如Zookeeper。Eureka 包含两个组件:Eureka Server和Eureka Client。
- Eureka Server:服务注册中心(可以是一个集群),对外暴露自己的地址
- Service Provider:微服务(可以是java程序,也可以python),启动后向Eureka注册自己信息(地址等)
- Service Consumer:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
- Eureka默认在90秒后还未收到服务提供者发来的心跳时,那么它就会认定该服务已经死亡就会注销这个服务。这里注销并不是立即注销,而是会在60秒以后对在这个之间段内“死亡”的服务集中注销,如果立即注销,势必会对Eureka造成极大的负担。这些时间参数都可以自定义配置
- 自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,所以不会再接收心跳,也不会删除服务。
二、服务构建
1、建立父子聚合项目
在父工程pom.xml
导入依赖
1 | <spring-cloud.version>2.5.2</eureka.version> |
2、建立Eureka注册中心
创建springboot模块,引入服务注册服务
1 | <dependency> |
进入application.yml
文件修改配置
1 | server: |
最后在启动类上添加@EnableEurekaServer
注解
1 |
|
启动localhost:8088
即可进入我的注册中心
- System Status:系统信息
- DS Replicas:服务器副本
- Instances currently registered with Eureka:已注册的微服务列表
- General Info:一般信息
- Instance Info:实例信息
3、建立Provider服务
创建新的springboot模块,引入依赖
1 | <dependency> |
进入application.yml
文件修改配置
1 | server: |
创建服务端服务
1 |
|
最后在启动类上加上@EnableEurekaClient
,启动即可加入注册中心
对于python开发的web程序,也可以注册到Eureka注册中心,这里我就举例Flask框架
1 | from flask import Flask |
启动访问localhost:5000
可正常访问,这里作为Provider
4、建立Consumer消费端
这里Ribbon替换成Spring Cloud Loadbalancer,可以自定义负载均衡算法,这里默认是轮询。通过@LoadBalanced,程序底层会默认通过ribbon将注册的服务名解析成具体的ip和端口,最后进行访问请求。
参考文档。
创建springboot模块,引入依赖
1 | <dependency> |
进入application.yml
文件修改配置
1 | server: |
在启动类添加注解
1 |
|
最后创建Cntroller,远程调用服务
1 |
|
启动后,此时通过8081端口访问即可获取8080以及flask服务端提供的服务
5、优化与提高
对于Eureka,info、还有集群、zone、region等
OpenFeign负载均衡
一、概述
相对于Ribbon+RestTemplate,其操作过于繁琐,在上面一节中已经简单写明,其通过OpenFeign可以简化开发。
OpenFeign是一个声明式的http客户端,让编写web服务客户端变的非常容易,只需要创建一个接口并在接口上添加注解即可。在底层,OpenFeign集成了Ribbon,利用Ribbon维护了springcloud-Dept的服务列表信息,接口会自动进行http请求相应的服务,其作用的替代RestTemplate,性能比较低,但是可以使代码可读性很强。
OpenFeign的前身是Feign,后者目前已经停更了,OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。
二、服务构建
1、多模块负载均衡搭建
在consumer模块的pom.xml
添加依赖
1 | <dependency> |
在student
模块中存在一个接口
1 | "/") ( |
在consumer
模块打开Feign注解
1 |
|
新建Feign接口类,在类上添加需要远程访问的服务名,方法则是该服务暴露的接口
1 | "student") (value = |
最后在controller
新增方法,调用该方法,启动项目即可内部远程调用
1 |
|
2、优化与提高
服务熔断、降级可以用resilience4j,不过网上实用资料好像不是很多,打算下次直接上sentinel了。
Spring Cloud Gateway网关
一、概述
API Gateway(APIGW / API 网关),顾名思义,是出现在系统边界上的一个面向 API 的、串行集中式的强管控服务,这里的边界是企业 IT 系统的边界,可以理解为企业级应用防火墙,主要起到隔离外部访问与内部系统的作用。
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。同时有以下特点:
- 基于Spring 5,Reactor(模式) 和 SpringBoot 2.0
- 能够在任何请求属性上匹配路由
- 断言和过滤器是特定于路由的
- Hystrix断路器集成
- SpringCloud DiscoveryClient集成
- 易于编写断言和过滤器
- 请求速率限制
- 路径重写
二、服务构建
1、Gateway网关搭建
继承Eureka配置
新建springboot模块,我这里取名为api,引入依赖
1 | <!-- spring cloud gateway 依赖 --> |
SpringCloud中Gateway与SpringBoot Web有jar包冲突,因此这里我没引入SpringBoot Web依赖
配置application.yml
配置文件
1 | server: |
在启动类上添加注解@EnableEurekaClient
,最后启动服务,访问http://localhost:8081/student/
,http://localhost:8081/flaskserver
,可以发现网关配置成功
2、Gateway网关配置详解
1 | server: |
3、优化与提高
Gateway还可以自定义配置过滤、鉴权等