Spring cloud
微服务的架构特征:
-
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
-
自治:团队独立、技术独立、数据独立,独立部署和交付
-
面向服务:服务提供统一标准的接口,与语言和技术无关
-
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
可以认为微服务是一种经过良好架构设计的分布式架构方案
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
注册中心: eureka、 nacos 【服务注册与发现】
远程调用: feign
负载均衡: ribbon
配置中心: config 、 nacos
网关: gateway
熔断器: hystrix 【熔断、降级、保护】
Eureka
Eureka的主要功能包括: 服务注册:Eureka注册中心会维护一个服务注册表,记录所有注册的服务实例信息,包括服务的IP地址、端口号、服务名称等。 服务发现:当一个服务实例启动后,会向Eureka注册中心注册自己的信息,Eureka会将该服务实例的信息注册到服务注册表中,其他服务可以通过Eureka来获取该服务实例的信息,实现服务之间的调用和发现。 服务续约:Eureka会定期向服务实例发送心跳,以保证服务实例的可用性和稳定性。如果一个服务实例长时间没有发送心跳,Eureka会将其从服务注册表中移除,从而保证服务的高可用性。 服务下线:当一个服务实例下线时,Eureka会将其从服务注册表中移除,从而保证服务的高可用性和可扩展性。 服务状态监控:Eureka会定期对服务实例的状态进行监控,如果一个服务实例出现问题,Eureka会将其从服务注册表中移除,从而保证服务的高可用性和可靠性。 总之,Eureka提供了一系列的功能和特点,可以帮助开发者更好地管理和监控微服务架构下的服务,提高服务的可用性和稳定性。
负载均衡
@LoadBalanced注解,即可实现负载均衡功能
SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:
基本流程如下:
-
拦截我们的RestTemplate
(RestTemplate是Spring Framework提供的一个用于访问RESTful Web服务的客户端类,它提供了一系列的HTTP客户端接口,可以方便地调用RESTful Web服务,获取服务的响应数据。)请求http://userservice/user/1
-
RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
-
DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表(dynamic 动态的)
-
eureka返回列表,localhost:8081、localhost:8082
-
IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
-
RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
Nacos
Nacos是一款开源的服务发现和配置管理平台,提供了一系列的功能和特点,包括:
-
服务注册和发现:Nacos支持基于DNS(它是一种用于将域名转换为IP地址的分布式数据库系统。)和HTTP/HTTPS协议的服务注册和发现,可以通过简单的配置和管理,实现服务的自动化注册和发现。
-
服务配置管理:Nacos支持配置管理,可以通过配置中心管理不同环境的配置信息,实现配置的集中管理和更新。
-
服务健康检查:Nacos支持服务的健康检查,可以通过健康检查来保证服务的可用性和稳定性。
-
服务流量控制:Nacos支持服务的流量控制,可以通过流量控制来限制服务的调用量和流量,保护服务的稳定性。
-
服务版本管理:Nacos支持服务的版本管理,可以通过版本管理来支持不同的版本和环境,实现服务的灰度发布和回滚。
-
服务元数据管理:Nacos支持服务的元数据管理,可以通过元数据管理来管理服务的元数据,包括服务的描述、标签、版本等。
-
服务安全管理:Nacos支持服务的安全管理,可以通过安全管理来保护服务的安全性,包括服务的认证、授权和加密等。
总之,Nacos提供了一系列的功能和特点,可以帮助开发者更好地管理和部署微服务架构下的服务,提高服务的可用性和稳定性。
Feign远程调用
Feign是一种声明式、模板化的HTTP客户端。 让微服务之间的调用变得更简单了,类似controller调用service。
你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
Spring Cloud feign集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
Feign的作用包括:
-
提供一种简单的方式来调用HTTP服务,避免了手动拼接HTTP请求和解析HTTP响应的麻烦。
-
支持多种编码方式,包括JSON、XML、表单等,可以根据不同的需求选择不同的编码方式。
-
支持Feign的注解和函数式编程两种方式,可以根据不同的需求选择不同的方式来调用HTTP服务。
-
支持异步请求和回调处理,可以更方便地处理长时间运行的任务和异步请求的结果。
-
提供了一些高级特性,例如支持Hystrix、Ribbon等服务容错和负载均衡算法,支持Spring Cloud的服务发现和注册机制等。
总之,Feign是一个Java Http客户端,它可以帮助我们更方便地调用HTTP服务,提高开发效率和代码质量。
Feign的优化:
1.日志级别尽量用basic
2.使用HttpClient或OKHttp代替URLConnection
① 引入feign-httpClient依赖
② 配置文件开启httpClient功能,设置连接池参数
网关是一种网络设备,它作为网络通信的中介,负责将从客户端发送来的请求转发到服务器,并将服务器返回的数据转发回客户端。网关的功能包括:
-
协议转换:网关可以将不同协议的数据转换为统一的协议,使得客户端可以透明地访问不同的服务。
-
负载均衡:网关可以根据负载均衡算法将请求分发到不同的服务器上,提高服务的可用性和性能。
-
安全控制:网关可以对请求进行安全控制,包括身份验证、访问控制、流量控制等,保护服务的安全性。
-
缓存:网关可以缓存一些数据,提高服务的响应速度和效率。
-
日志记录:网关可以记录客户端的请求和服务器的响应,方便开发和调试。
总之,网关是一种重要的网络设备,它可以帮助企业实现网络通信的集中管理和控制,提高网络的安全性和效率。
网关的核心功能特性:
-
身份认证和权限校验
-
服务路由、负载均衡
-
请求限流
注意:Spring Cloud Gateway本身也是一个微服务,需要注册到注册中心。
网关在架构中的位置:
-
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都可经过网关,然后再由网关来实现 鉴权、动态路由等等操作。Gateway就是我们服务的统一入口。
过滤器
路由过滤器的作用是什么?
① 对路由的请求或响应做加工处理,比如添加请求头
② 配置在路由下的过滤器只对当前路由的请求生效
defaultFilters的作用是什么?
-
对所有路由都生效的过滤器
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。
public interface GlobalFilter { /** * 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理 * * @param exchange 请求上下文,里面可以获取Request、Response等信息 * @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束 */ Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain); }
在filter中编写自定义逻辑,可以实现下列功能:
-
登录状态判断
-
权限校验
-
请求限流等
-
全局过滤器的作用是什么?
-
对所有路由都生效的过滤器,并且可以自定义处理逻辑
实现全局过滤器的步骤?
-
实现GlobalFilter接口
-
添加@Order注解或实现Ordered接口
-
编写处理逻辑
执行顺序:
-
order值越小,优先级越高,执行顺序越靠前。
-
当过滤器的order值一样时,会按照 defaultFilter > 局部路由过滤器 >全局 GlobalFilter的顺序执行。
Gateway与Feign、nginx的区别:
-
Gateway:接收系统外部请求, 作为整个应用的流量入口,接收所有的请求,如PC、移动端等,并且将不同的请求转发至不同的处理微服务模块,其作用可视为nginx;大部分情况下还可以用于权限鉴定、服务端流量控制;
-
Feign :系统内部调用,则是将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用;
-
nginx: 一般在大型项目中,存放静态资源,还可以用作反向代理和负载均衡服务器
-
gateway和nginx在架构上的区别:
gateway 是前端工程 到 后台服务器之间的一个 对内网关
nginx是用户到 前端工程 的网关,对外网关