桂林分销网站开发,做logo网站的公司,虚拟主机网站怎么上传文件,网站建设亇金手指专业【微服务学习笔记#xff08;一#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂一】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂Route Predicate Factory路由过滤器GatewayFliter全局过滤器GlobalFilter 过滤器执行顺序跨域 本篇内容为学习笔记学习链接为SpringCloudRabbitMQDockerRedis搜索分布式系统详解springcloud微服务技术栈课
课程资料链接可在视频下方找到此处不粘贴而以下的代码都是资料中有的只不过做为记录单独粘贴做为学习使用的参考步骤。
总览
微服务中需要用到的内容 服务网关、 服务集群、 注册中心、配置中心、消息队列在和数据库连接过程中则用到分布式缓存、分布式搜索还需要的额外服务为分布式日志、系统监控链路追踪。
在以上的完成后使用Jenkins完成自动化编译的过程由Docker打包成镜像。
各个内容中所需的技术
微服务注册发现 EurekaNacosConsul 服务远程调用 OpenFeginDubbo 服务链路监控 ZipkinSleuth 统一配置管理 SpringCloudConfigNacos 统一网关路由 SpringCloudGatewayZuul 流量监控、降级、保护 HystixSentinel
Nacos
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
安装配置
Nacos文档链接 可以参考文档下载Nacos。
Windows启动命令(standalone代表着单机模式运行非集群模式):
startup.cmd -m standalone打开nacos - bin目录中使用cmd启动输入以上命令点击生成的地址即可进入Nacos页面。
使用 项目中 父工程pom文件
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2.2.5.RELEASE/versiontypepom/typescopeimport/scope
/dependency子工程pom文件
!-- nacos客户端依赖包 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency客户端子配置文件application.yml中
spring:application:name: userServicecloud:nacos:server-addr: localhost:8848Nacos注册中心
服务多级存储模型
一级为服务、二级为集群、三级为实例。
项目中采用配置 nacos:server-addr: localhost:8848discovery:cluster-name: CQ #自定义集群名称集群的设置可让某一个服务被集群内的服务请求优先访问。
负载均衡规则
NacosRule优先选择本地集群访问本地集群内随机访问各个服务本地集群无服务时进行跨集群访问
在Nacos页面中根据权重调整0~1权重越小访问的概率越小
环境隔离
通过namespace进行环境隔离 1、nacos命名空间中创建 2、客户端服务中放入namespace生成的id号 3、重启服务刷新nacos页面
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ #自定义集群名称namespace: c2a69c6f-995c-4cc0-a3e1-8f545ece5875默认情况下服务为临时实例心跳检测即为每隔一段时间向注册中心发送内容证明还在服务。 而非临时实例的主动询问询问结果为服务关闭时注册中心会等待服务恢复。
临时实例修改为非临时实例
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ #自定义集群名称namespace: c2a69c6f-995c-4cc0-a3e1-8f545ece5875ephemeral: false #是否为临时实例修改后在Nacos中心查看 配置管理
获取配置原理
添加配置打开Nacos页面 配置拉取
客户端依赖
!-- nacos配置管理依赖--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencyresouces中新建bootstrp.yml文件内容符合在nacos配置管理中的配置
spring:application:name: userserviceprofiles:active: dev #环境cloud:nacos:server-addr: localhost:8848config:file-extension: yaml #文件后缀名配置热更新
方法一 通过Value注解注入RefreshScope刷新
RefreshScope
public class UserController {Autowiredprivate UserService userService;Autowiredprivate PatternProperties patternProperties;Value(${pattern.dateformat})private String dateformat;
}方法二 注入后自动刷新声明于类前
ConfigurationProperties(prefix pattern)多服务共享配置
多服务共享配置会根据读取优先级来进行配置在此处主要介绍各个配置文件的优先级以此来完成所想达到的共享配置目标。
微服务会从nacos读取的配置文件:
[服务名]-[spring.profile.active].yaml环境配置[服务名].yaml默认配置多环境共享
优先级:
[服务名]-[环境].yaml [服务名].yaml 本地配置
Feign
Feign为声明式Http客户端帮助实现http请求发送其中已经集成了ribbn不需担心负载均衡。
远程调用
客户端依赖
!--feign客户端依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencyEnableFeignClients自动装配开关
EnableFeignClients(clients UserClient.class,defaultConfiguration DefaultFeignConfiguration.class)
public class OrderApplication {
}创建新类UserClient
FeignClient(value userservice)
public interface UserClient {GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}OrderService Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.findById(orderId);// 2.用Feign远程调用User user userClient.findById(order.getUserId());// 3.封装user到Orderorder.setUser(user);// 4.返回return order;}配置 日志配置
方法一 配置文件中
feign:client:config: default:loggerLevel:FULL #看所有的日志方法二
性能优化
方法一使用连接池HttClient或者OKHttp代替默认URLConnection 客户端依赖配置
!--引入HttpClient依赖--dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-httpclient/artifactId/dependency客户端配置
feign:httpclient:enabled: true # 支持HttpClient的开关max-connections: 200 # 最大连接数max-connections-per-route: 50 # 单个路径的最大连接数方法二日志级别尽量不使用basic或none
Fegin使用 统一网关Gateway
网关功能:
身份认证和权限校验服务路由、负载均衡请求限流
在SpringCloud中网关的实现包括两种:
Gatewayzuul
Zuul是基于Servlet的实现属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux属于响应式编程的实现具备更好的性能。
搭建网关
1、引入依赖
网关模块pom
!--nacos服务注册发现依赖--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--网关gateway依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency2、编写路由配置以及nacos地址
server:port: 10010
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由标示必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言判断请求是否符合规则- Path/user/** # 路径断言判断路径是否是以/user开头如果是则符合- id: order-serviceuri: lb://orderservicepredicates:- Path/order/**default-filters: #过滤器处理请求或响应- AddRequestHeaderTruth,Itcast is freaking awesome!路由断言工厂Route Predicate Factory
我们在配置文件中写的断言规则只是字符串这些字符串会被 Predicate Factory读取并处理转变为路由判断的条件。 例如Path/user/**是按照路径匹配这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的。 路由过滤器GatewayFliter
网关过滤器对进入网关的请求和微服务返回的响应做处理。
作用对路由的请求或响应做加工处理比如添加请求头配置在路由下的过滤器。
spring:cloud:gateway:routes:filters: #给单独微服务添加过滤器只对当前路由的请求生效- AddRequestHeaderTruth,Itcast is freaking awesome!全局过滤器GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义处理逻辑是固定的。
而Globalfiter的逻辑需要自己写代码实现定义方式是实现GlobalFilter接口。 Component
public class AuthorizeFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数ServerHttpRequest request exchange.getRequest();MultiValueMapString, String params request.getQueryParams();// 2.获取参数中的 authorization 参数String auth params.getFirst(authorization);// 3.判断参数值是否等于 adminif (admin.equals(auth)) {// 4.是放行return chain.filter(exchange);}// 5.否拦截// 5.1.设置状态码给用户合适的报错exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse().setComplete();}Overridepublic int getOrder() {//设置过滤优先级数值越大优先级越低return -1;}
}在以上代码中使用getOrder方法设置过了优先级除此之外还可以在该类声明上使用Order(-1)注解规定优先级。
过滤器执行顺序
所有过滤器都来自于GatewayFilter因此得以进行排序。
路由过滤器和defaultFilter的order由Spring指定默认是按照声明顺序从1递增 跨域
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求请求被浏览器拦截的问题
通过CORS方案让浏览器询问服务器判断是否可以进行跨域。
spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:[/**]:allowedOrigins: # 允许哪些网站的跨域请求- http://localhost:8090- http://www.leyou.comallowedMethods: # 允许的跨域ajax的请求方式- GET- POST- DELETE- PUT- OPTIONSallowedHeaders: * # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期