集中式架构
优点:系统开发速度快
维护成本底
适用于并发要求低的系统
缺点:代码耦合性非常高
后期维护成本高
无法针对的不同的模块进行优化
容错率低,并发能力差
一、微服务架构的特征:
1、单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责, 避免重复业务开发
2、面向服务:微服务对外暴露业务接口
3、自治:团队独立,技术独立,数据独立,部署独立
4、隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题
二、微服务拆分注意事项:
1、不同微服务,不要重复开发相同业务
2、微服务数据独立,不要访问其他微服务的数据库
3、微服务可以将自己的业务暴露为接口,供其他微服务调用
Eureka
一、Eureka注册中心:
1、注册服务信息
2、拉取服务
3、服务每隔30秒向Eureka发起心跳,确认存活
二 、搭建EurekaServer :
1、创建项目,引入spring-cloud-starter-eureka-server的依赖
2、编写启动类,添加@EnableEurekaServer注解
3、添加application.yml文件
Ribbon
一、Ribbon负载均衡流程:
1、发起请求——>RibbonLoadBanlancerClient
2、获取url中的服务id——>DynamicServerListLoadBalancer
3、拉取服务名——>eureka-server
4、返回服务列表——>DynamicServerListLoadBalancer
5、服务负载均衡——>IRule(每一个子接口都是一个规则)
6、通过规则选择某个服务——>RibbonLoadBanlancerClient
7、修改\替换url发起请求
二、负载均衡策略:
通过定义IRule实现跨越修改负载均衡规则,有两种方式:
1、代码方式: 在order-service中的orderApplication类中,定义一个新的irule:
(作用于全局,即无论调用哪一个服务都是随机的。)
2、配置文件方式:在 order-service的application.yml文件中添加新的配置也可以修改规则。 (服务名:ribbon:NFloadBalancerRuleClassName:com.netflix.loadbalaner.RandomRule)
三、饥饿加载:
1、ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很 长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥 饿加载:
2、ribbon:
eager-load:
enable: true #开启饥饿加载
clients: userserver #指定对userservice这个服务饥饿加载
Nacos
cluster
一、Nacos服务搭建、注册、发现:
1、startup.cmd -m standalone 单机模式启动
2、父pom、和服务,添加nacos依赖
3、服务配置添加spring.cloud.nacos.server-addr: 服务地址
二、Nacos服务分级存储,配置集群属性:
1、修改服务yml文件,添加cloud.nacos.discovery.cluster-name: 集群名称,优先选择本地 集群,修改负载均衡配置。
三、NacosRule负载均衡策略:
(Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。)配置权重
(Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔 离。)环境隔离
1、优先选择同集群服务实例列表
2、本地集群找不到提供者,去其他服务集群找,并会报警告
3、确定了可用实力列表后,再随机负载均衡挑选实例
四、Nacos和Eureka差别:
1、服务提供者的健康检测:服务注册到nacos时,可以选择注册为临时或非临时实例, (都支持心跳方式) 非临时实例服务不会做心跳,而是nacos主动询问服务
nacos不会把非临时实例从列表中剔除,而仅仅是标记为不
健康了。等待此服务恢复健康
cloud.nacos.discovery.ephemeral:
(临时实例和非临时实例,默认为true,所有的均为临时实例)
2、服务消费者的拉取服务:Eureka,每隔一段时间向注册中心拉取
(服务的注册和拉取) Nacos,主动推送给消费者变更信息
五、Nacos配置自动刷新:
1、在@Value注入的变量所在类上添加注解@RefreshScope
2、使用@ConfigurationProperties注解注入到类里(推荐使用)
六、多环境配置共享:
1、微服务启动时会从nacos读取多个配置文件,[spring.application.name].yaml这个文件一 定会加载
2、多种配置同属性的优先级,服务名-profile.yaml > 服务名.yaml > 本地配置
Feign
一、Feign远程调用:
(优雅的实现http请求发送)
1、引入依赖,spring-cloud-starter-openfeign
2、启动类添加注解开启feign功能,@EnableFeignClients
3、编写feign客户端,服务名称,请求方式,请求路径,请求参数,返回值列表
4、feign代替restTeplate:
启动类注入RestTemplate; .getForObject(url, User.class)发送请求
二、Feign的日志配置:
1、配置文件,feign.client.config.xxx(服务名或者default).loggerLevel
2、配置代码,Logger.Level Bean注入;@EnableFeignClients代表全局,@FeignClient代 表某服务
三、Feign的优化:
1、日志级别尽量用basic
2、使用HttpClient或OKHttp代替URLConnection
引入feign-httpClient依赖
配置文件开启httpClient功能,设置连接池参数
四、熔断:
1、雪崩效应,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
2、熔断,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
3、依赖,spring-cloud-starter-netflix-hystrix
启动类,@EnableCircuitBreaker
远程调用,@HystrixCommand(fallbackMethod = "tishi")
Gateway
一、网关Gateway
1、身份认证和权限校验
2、服务路由、负载均衡
3、请求限流
4、过滤请求和响应
二、网关搭建步骤:
1、创建model,引入gateway依赖和nacos的服务发现依赖
2、配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:路由id、路由目标(uri)、路由断言、路由过滤器
三、路由过滤器的作用:
1、gatewayfilter,可以对进入网关的请求和微服务返回的响应做处理
2、配置再路由下的过滤器只对当前路由的请求生效,defaultFilters(所有路由生效)
四、全局过滤器的作用:
1、也是处理一切进入网关的请求和微服务响应,与gatewayFilter的作用一样。
区别在于gatewayfilter通过配置定义,处理逻辑是固定的,
而globalfilter的逻辑需要自己携带写代码实现。
2、步骤,实现GlobalFilter接口,添加@Order注解或实现Ordered接口,编写处理逻辑
五、过滤器执行顺序:
1、order值越小,优先级越高
2、当order值一样时,defaultFilter最先,然后是局部的路由过滤器,最后全局过滤器
六、跨域问题处理:
1、跨域:域名不一致就是跨域,主要包括:域名不同和域名相同,端口不同
2、跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的 问题。
解决方案: CORS