之前我们也说了Ribbon+RestTemplate的组合调用微服务的模式
我们在RestTempkate上面加一个 @LoadBalanced就可以达到 客户端负载均衡的效果
但是这种有个缺点就是
我们希望 调用的时候可以向我们service层面调用Dao层一样
@Autowired 注入 然后 类名.方法名
比如说dao.userDation() 直接调用这样简单明了
1.我们导入jar 在user项目中
2.添加注解 @EnableFeignClients 开启Feign调用
其实OpenFeign 底层封装了Ribbon
第三我们建一个Feign包
// 微服务的名称 前缀
//@FeignClient(value = "mall-order",path = "/order")
@FeignClient(value = "mall-order")
public interface OrderFeign {
@GetMapping("/")
String getOrder();
}
//1/ User中的Controller
@GetMapping("/getUser4")
public String getUser4(){
String order = orderFeign.getOrder();
log.info("invoke do Res "+ order);
System.out.println(order);
return "helloUser。。。"+order;
}
以上就是Feign的基本使用 但是如何自定义Feign.默认情况下Feign调用是没有日志的
我们需要通过自定义来打印我们的Feign的日志 (basic适 用于生产环境)
Full级别的
Step[1] 我们先加一个OrderCenterFeignConfig 表明是一个配置类 此时不要加@Configuration,标注此时日志级别为FULL ,这里代表 打印的日志级别是FULL 级别,这里代表具体打印什么
Step2 这里的configuration 指向 OrderCenterFeignConfig 就可以唉~
Step3
logging:
level:
com.lvhao.feign: DEBUG
在yaml中设置feign 包下面的日志级别为Debug 这里代表 输出到控制台上
FULL 级别下的日志~
2022-04-13 07:39:21.808 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.810 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.814 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.815 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:39:21.815 DEBUG 21216 --- [nio-9091-exec-3] com.lvhao.feign.OrderFeign : [OrderFeign
HEADERS下的日志
2022-04-13 07:45:54.097 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.098 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.103 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.103 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.103 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.103 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.104 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:45:54.104 DEBUG 14080 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
BASIC 级别下的日志~
2022-04-13 07:47:38.341 DEBUG 16720 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
2022-04-13 07:47:38.349 DEBUG 16720 --- [nio-9091-exec-2] com.lvhao.feign.OrderFeign : [OrderFeign
-------------------------->>>>>>>>>>>>
NONE 当然没有日志打印了~ 一般生产上打印BASIC 就可以
打印 HEADERS 以及FULL 日志多了 磁盘会撑不住的~
我们再说一个关于feign 的问题就是 Feign的拦截器配置
通过OpenFeign调用会丢失请求头的,这样最常见的例子就是jwt 用户登录 吧请求头的token 在user发送请求的时候携带过去
/**
* <p>Title: GlFeignConfig</p>
* Description:
* date:2020/6/30 19:25
*/
@Configuration
public class GlFeignConfig {
@Bean("requestInterceptor") // 给容器放入一个拦截器 feign 在远程调用之前先经过apply方法
public RequestInterceptor requestInterceptor(){
// Feign在远程调用之前都会先经过这个方法
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
// RequestContextHolder拿到刚进来这个请求 拿到请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(attributes != null){
HttpServletRequest request = attributes.getRequest(); // 当前请求 同步请求头数据主要请求头
if(request != null){
// 同步请求头数据
String cookie = request.getHeader("Cookie");
// 给新请求同步Cookie
template.header("Cookie", cookie);
}
}
}
};
}
}
我们需要加入关于拦截器的配置 这样的话 请求头就不会丢失~ 就能通过user 服务发过来
配置中心nacos 什么是配置中心
我们都知道我们的微服务部署的时候,有生产,开发,其他环境,比如说Order服务, 然后这些环境对应一个application.prod来指定, 通过Spring.profile.active=prod/dev/other 来切换
但是这样做有什么缺点呢
1. 所有环境配置都是明文的,比如说db连接, redis连接这些
第二 不支持动态刷新,比如说我要更改db连接配置 更改完之后需要重启才可以生效唉~
根据以上问题 我们才有的配置中心
nacos 主要的2个功能一个做配置中心 一个做服务的注册和发现
关于配置中心
无非就是发布配置
获取配置
删除配置
一样nacos 的配置中心的对外接口也是对外暴露的意味着我们可以用postman去点
根据这幅图,我们微服务需要解决的问题
1)我微服务怎么知道配置中心的地址
2)我微服务到底需要连接哪个环境
3)怎么找到nacos config上的对应的配置文件
nacos 配置中心也是 、
1.pom 2. 配置 (此时要写一个bootstrap.yml的配置文件)3. 注解
我们
@RefreshScope/* 动态从配置中心获取*/
我们需要
@RefreshScope/* 动态从配置中心获取*/ 这样我们就可以做到配置从注册中心获取实时数据了 做到动态刷新
..nacos 的配置pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
application:
name: mall-user
profiles:
active: dev
然后
@Value("${isNewBus}")
private boolean isNewBus;
// 我们就可以看到效果了~
因为我们加入了@RefreshScope
所以我们现在更改配置 为true 我们就不用重启项目
做到配置中心自动刷新了
以上就是nacos 配置中心的最简单的应用
现在 我各个环境的通用配置怎么配置
比如说我 生产,开发,测试 都要有这么一段配置
server:
servlet:
context-path:/config-appp
我们可以去掉-dev来进行发布 现在我们重启下项目看看
我们还可以做到不同工程的相同配置 比如说 服务的注册我们可以吧这个作为公共配置放在nacos服务配置中 各个项目就可以不用配置了 直接读取
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
比如说我此时建立一个yaml 的文件 comon.yaml 放的就是公共配置
我们可以 在 代码中这样配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
shared-dataids: comon.yaml
refreshable-dataids: comon.yaml
application:
name: mall-user
profiles:
active: dev
然后吧mall-user
中application.yml 的yml中的有关服务注册与发现
的ip去掉 重新启动项目 可以发现服务已经注册上来了
comon.yaml 然后我们看 comon.yaml 已经加载过来了
nacos 底层用的derby内存型数据库存储的,
在集群配置的时候 比如说3台nacos节点,因为他们是内置db
每一份都有自己 配置他不能同步
所以我们要吧他们改成mysql 类似于这样的 nacos可以配置
我们可以在他的config-info 中更改他的db连接
当然nacos 还是支持配置的动态回滚的 比如说这里的更多
可以切换到以前的版本