Ribbon负载均衡
①:负载均衡流程

②:负载均衡策略(了解即可)
Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则


③: 饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。 而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

1.Ribbon负载均衡规则
规则接口是IRule
默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
2.负载均衡自定义方式
代码方式:配置灵活,但修改时需要重新打包
配置方式:直观,方便,无需重新打包发布但是无法做全局配置
3.饥饿加载
开启饥饿加载
指定饥饿加载的微服务名称
Nacos注册中心
Nacos安装
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页: github.com/alibaba/nac...
下载页: github.com/alibaba/nac...


windows版本使用 nacos-server-1.4.1.zip 包即可
解压
将这个包解压到任意非中文目录下

bin:启动脚本 conf:配置文件
端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
修改内容

进入bin目录 启动

windows命令
startup.cmd -m standalone

在浏览器输入地址:http://127.0.0.1:8848/nacos即可

默认的账号和密码都是nacos,进入后:

服务注册到Nacos
- 在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-
注释掉order-service和user-service中原有的eureka依赖。
-
添加nacos的客户端依赖:
xml
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址



Nacos服务分级存储模型

服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其它集群

⑥:服务集群属性

yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置

根据集群负载均衡
修改user-service集群属性配置

ini
-Dserver.port=端口号
ini
-Dspring.cloud.nacos.discovery.cluster-name=BJ 添加集群

根据集群负载均衡
- 修改order-service中的application.yml,设置集群为HZ:
yaml
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置
- 然后在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:

yaml
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则


NacosRule负载均衡策略
① 优先选择同集群服务实例列表
② 本地集群找不到提供者,才去其它集群寻找,并且 会报警告
③ 确定了可用实例列表后,再采用随机负载均衡挑选 实例
根据权重负载均衡
实例的权重控制
Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问
环境隔离 - namespace

-
在Nacos控制台可以创建namespace,用来隔离不同环境
-
然后填写一个新的命名空间信息:

- 保存后会在控制台看到这个命名空间的id:

4.修改order-service的application.yml,添加namespace:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/heima?useSSL=false
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH # 上海
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID ##
- 重启order-service后,再来查看控制台:

Nacos环境隔离
namespace用来做环境隔离
每个namespace都有唯一id
不同namespace下的服务不可见
nacos注册中心细节分析

临时实例和非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
yaml
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
nacos与eureka的区别'
1.Nacos与eureka的共同点
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式 ; Eureka采用AP方式
Nacos配置管理
配置更改热更新

在Nacos中添加配置信息:


配置内容
ruby
pattern:
dateformat:yyyy年MM月dd日 HH:mm:ss
配置获取
1.引入Nacos的配置管理客户端依赖:
xml
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于 application.yml:

yaml
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
日志
yaml
mybatis:
type-aliases-package: cn.jinzhu.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.jinzhu: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS

在user-service中将pattern.dateformat这个属性结合@Value注解注入到UserController中做测试:
less
@RestController
@RequestMapping("/user")
public class UserController {
// 注入nacos中的配置属性
@Value("${pattern.dateformat}")
private String dateformat;
// 编写controller,通过日期格式化器来格式化现在时间并返回
@GetMapping("now")
public String now(){
return LocalDate.now().format(
DateTimeFormatter.ofPattern(dateformat, Locale.CHINA)
);
}
// ... 略
}

配置自动刷新
方式一: 在@Value注入的变量所在类上添加注解@RefreshScope 在UserController层


方式二: 通过@ConfigurationProperties注入,自动刷新
Nacos中的配置文件变更后,微服务无需重启就可以感知。

要在UserController服务层注入写好的配置类

多环境配置共享
1.在Nacos中添加配置信息


2.在comfig层PatternProperties类里面添加成员变量

3.返回UserController服务层添加并注入返回对象


多种配置的优先级: 
可读性差、参数复杂URL难以维护
网关Gateway

在SpringCloud中网关的实现包括两种:
gateway
zuul
Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响 应式编程的实现,具备更好的性能。
搭建网关服务
搭建网关服务的步骤:
- 创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
xml
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.编写路由配置及nacos地址

yaml
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
网关作用流程

路由断言工厂Route Predicate Factory

关于断言工厂为什么不是过滤器
断言工厂是用来匹配请求的,比方说有很多微服务交由网关管理。
每个微服务都有不同的断言 工厂配置,有的微服务必须几点之前、有的微服务必须什么IP
当前端发来URL,请求的时候,URL会跟配置中比较
满足断言工厂配置条件的才能找到对应的服务并响应

路由过滤器 GatewayFilter

( 了解即可)

默认过滤器
例: 给所有进入userservice的请求添加一个请求头

yaml
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
uri: lb://userservice
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
- Before=2028-01-20T17:42:47.789-07:00[America/Denver]
- id: order-service # 路由id,自定义,只要唯一即可
uri: lb://orderservice
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/order/** # 这个是按照路径匹配,只要以/user/开头就符合要求
filters: # 过滤器
- AddRequestHeader=Truth, Good! # 添加请求头
全局过滤器GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

过滤器执行顺序

1、 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
2、 GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
3、 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
4、 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器>GlobalFilter的顺序执行
跨域问题处理
跨域:域名不一致就是跨域,主要包括:
域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.co
域名相同,端口不同:localhost:8080和localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
解决方案:CORS


csharp
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://127.0.0.1:5500"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期