学习内容:
1.nacos 配置管理
2.feign远程调用
3.Gateway网关
学习目的:
1.nacos 配置管理:
当我们因为具体开发环境,业务需求,等因素,微服务部署实例日渐增多,逐一修改一些统一配置,不仅浪费时间,而且容易出错,而nacos配置中心,可以为我们统一管理实例配置,并且实现热更新
2.feign远程调用
之前我们用RestTemplate发起的远程调用,这种方法的弊端:1.代码维护性差,后期url长又多,容易写错,2.代码可读性差
优雅永不过时,feign的出现,为我们优雅的解决了此类问题
3.Gateway网关
是Spring Cloud中一个重要的组件
核心功能:
请求路由 : 网关不处理业务,但网关可以把请求,转发到某个微服务,这个过程叫做
路由
权限控制 : 关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进
行拦截
限流 :当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放 行请求,避免服务压力过大。
个人理解: 网关具备的作用就像是水坝开闸放水一样, 可以限制流量的大小,可以引导请求找到自己相对应的服务,可以检验请求是否具备请求资格
一.nacos 配置管理:
1.从微服务拉取配置
1)引入nacos-config依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)添加bootstrap.yaml
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
2.配置热更新
方式一:
在@Value注入的变量所在类上添加注解@RefreshScope:
方式二:
使用@ConfigurationProperties注解代替@Value注解
3.配置共享
不受隔离环境影响,所有环境都快可以读到次配置
二.Feign远程调用
1)引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)添加注解
添加@EnableFeignClients , 开启feign功能
3)编写Feign的客户端
二.修改日志级别
1) yaml方式
1.针对个别服务
feign:
client:
config:
userservice: # 针对某个微服务的配置
loggerLevel: FULL # 日志级别
2.针对所有服务
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
2)java代码方式
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
如果是局部生效,则把它放到对应的@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
三.Feign使用优化
1)引入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
四.利用抽取继承方式,降低代码的重复性,专业的模块干专业的事
注意:
@EnableFeignClients(basePackages = “cn.itcast.feign.clients”) 包扫描路径!!!
3.Gateway服务网关
1)创建gateway服务,引入依赖
<!--网关-->
<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)编写启动类
3)编写基础配置和路由规则
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/开头就符合要求
4.过滤器工厂
1.路由过滤器的种类
2.请求头过滤器
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
filters: # 过滤器
- AddRequestHeader=name, Itcast is freaking awesome! # 添加请求头
3.默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path=/user/**
default-filters: # 默认过滤项
- AddRequestHeader=Truth, Itcast is freaking awesome!
自定义全局过滤器
在filter中编写自定义逻辑,可以实现下列功能:
- 登录状态判断
- 权限校验
- 请求限流等
方式是实现GlobalFilter接口。
代码示例
package cn.itcast.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.获取authorization参数
String auth = params.getFirst("authorization");
// 3.校验
if ("admin".equals(auth)) {
// 放行
return chain.filter(exchange);
}
// 4.拦截
// 4.1.禁止访问,设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 4.2.结束处理
return exchange.getResponse().setComplete();
}
}
面试题
一.配置中心的作用? 如何使用?
二.nacos如何动态变更配置?
方式一:
在@Value注入的变量的类上添加@RefreshScope
方式二:
使用@ConfigurationProperties
三.nacos如何保证高可用?
搭建nacos集群
步骤:
- 搭建nacos数据库,初始化数据库表结构
- 配置nacos
- 启动nacos集群
- nginx反向代理
四.feign的介绍及作用?
介绍:Feign是一个声明式的http客户端
作用:帮助我们优雅的实现http请求的发送
五.如何使用feign进行远程服务调用?
六.feign的基本工作原理?
feign通过我们定义的接口,生成一个代理对象,具体由JDK动态代理实现,生成代理的同时会根据注解生成一个Map,接口方法调用时,会进入invoke方法,然后根据调用的方法从Map中获得一个MethodHandler,然后通过 MethodHandler 根据指定的 client 来完成处理
七.是否对feign进行过性能优化?
feign默认的是URLConnection,不支持连接池,我们可以通过配置,使feign支持连接池,
1) 引入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2) 配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
八.gateway网关的介绍及作用?
gateway网关是SpringCloud原生组件之一,是我们所有微服务的统一入口
作用:
请求路由
权限控制
限流
九.如何搭建一个gateway网关?
1.创建项目,引入nacos服务发现和gateway依赖
2.配置application.yml,包括服务基本信息、nacos地址、路由
十.网关中路由的作用?
1.判断是否有请求资格
2.引导请求找到对应的服务
3.对请求和响应进行过滤
十一.gateway中断言的作用?
Predicate Factory读取并处理,变为路由判断的条件