当前位置: 首页 > news >正文

微服务技术栈-Nacos配置管理和Feign远程调用

文章目录

  • 前言
  • 一、统一配置管理
    • 1.添加配置文件
    • 2.微服务拉取配置
    • 3.配置共享
  • 三、Feign远程调用
  • 总结


前言

在上篇文章中介绍了微服务技术栈中Nacos这个组件的概念,Nacos除了可以做注册中心,同样可以做配置管理来使用。同时我们将学习一种新的远程调用方式Feign,它可以帮助我们优雅的实现http请求的发送。


一、统一配置管理

1.添加配置文件

Nacos除了可以做注册中心,同样可以做配置管理来使用。每个微服务可以从Nacos拉取相关配置,同时当Nacos中的配置发生变化的时候,可以及时通知到每个微服务。
在这里插入图片描述

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新
1.添加配置文件的方法,在配置管理右边点击加号按钮。
在这里插入图片描述
2.弹出的表单中,填写配置信息:
1.Data ID:[服务名称]-[profile].[后缀名]
2.Group:分组默认即可
在这里插入图片描述
注意:需要热更新的配置(核心配置)才有放到nacos管理的必要,基本不会变更的一些配置还是保存在微服务本地比较好。

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
在这里插入图片描述

2.微服务拉取配置

接下来演示一下从微服务拉取配置:
1)引入nacos-config依赖

<!--nacos配置管理依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2)添加bootstrap.yaml

在这里插入图片描述
3)读取nacos配置(热更新)
@Value注解可以帮助我们从配置文件中读取属性的值,在这里我们使用一个@ConfigurationProperties注解代替@Value注解。在user-service服务中,添加一个类,读取patterrn.dateformat属性。

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;
}

在UserController中直接使用@Autowired注解注入这个类即可使用。

    @Autowiredprivate PatternProperties patternProperties;@GetMapping("/now")public PatternProperties now(){return patternProperties;}

3.配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml,userservice-test.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享,不管是dev,还是test环境,都可以读到userservice.yaml中的配置信息。
在这里插入图片描述

当nacos、服务本地同时出现相同属性时,优先级有高低之分,遵循一个原则:nacos优先,本地随后。
在这里插入图片描述


三、Feign远程调用

以前利用RestTemplate发起远程调用的代码:

String url="http://userservice/user/"+order.getUserId();
User user = restTemplatel.getForObject(url, User.class);

缺点:代码可读性差,编程体验不统一,代码里面出现url,还要手动维护参数。

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

什么是声明式:声明式编程是一种编程范式,它指定程序应该做什么,而不具体说明怎么做。

Feign的作用就是帮助我们优雅的实现http请求的发送。接下来我们来动手实践使用Feign替代RestTemplate帮助我们发送请求。
1)引入依赖:在order-service服务的pom文件中引入feign的依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)添加注解:在order-service的启动类添加@EnableFeignClients注解开启Feign的功能。
在这里插入图片描述

3)编写Feign的客户端
将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。
1.在父工程中,首先创建一个module,命名为feign-api。
在这里插入图片描述

2.在feign-api中然后引入feign的starter依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.在feign-api中编写UserClient(不要忘记把User也拿到该模块里面来)。

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id")Long id);
}

4.在order-service中使用feign-api(不要忘记在opom文件中中引入自己创建的feign-api模块)

<dependency><groupId>cn.itcast.demo</groupId><artifactId>feign-api</artifactId><version>1.0</version>
</dependency>

5.在OrderService中直接注入feign-api中的UserClient,注入完直接使用即可。

@Service
public class OrderService {@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {//1.查询订单Order order = orderMapper.findById(orderId);//2.查询用户User user = userClient.findById(order.getUserId());order.setUser(user);//3.返回return order;}
}

6.启动测试,在启动时会直接报错,因为UserClient现在在cn.itcast.feign.clients包下,而order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient。

解决方法:修改order-service的@EnableFeignClients注解,指定Feign应该扫描的包。

@EnableFeignClients(basePackages = "cn.itcast.feign.client")

修改完注解后,重启服务,在查询订单的同时就可以把用户的信息同时查询了出来,即使用Feign替代RestTemplate帮助我们发送请求。


总结

本章介绍了Nacos配置管理和Feign远程调用,对于哪些配置需要在Nacos中进行管理,哪些需要写到本地还需要根据不同的业务要求来,没有统一的标准。Feign可以帮助我们更加优雅的实现http请求的发送,且代码维护起来更容易。


http://www.lryc.cn/news/187205.html

相关文章:

  • 操作系统 OS
  • 基于ffmpeg给视频添加时间字幕
  • 爬虫基础知识点快速入门
  • 解释器模式 行为型模式之五
  • 2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]
  • 常见的通用型项目管理软件推荐
  • 手机总是提醒系统更新,到底要不要更新呢?
  • 什么是API
  • RedissonClient 分布式锁 处理并发访问共享资源
  • Hadoop-2.5.2平台环境搭建遇到的问题
  • 基于WTMM算法的图像多重分形谱计算matlab仿真
  • VR全景展示带来旅游新体验,助力旅游业发展!
  • Xcode 15 编译出错问题解决
  • 基于指数趋近律的机器人滑模轨迹跟踪控制算法及MATLAB仿真
  • 华为云API自然语言处理的魅力—AI情感分析、文本分析
  • 微擎小程序获取不到头像和昵称解决方案
  • Qt 对界面类重命名的步骤
  • 使用docker搭建nacos单机、集群 + mysql
  • FreeRTOS自我救赎2之基本工程建立
  • 【C++设计模式之解释器模式:行为型】分析及示例
  • 35 WEB漏洞-逻辑越权之找回机制及接口安全
  • 黑豹程序员-架构师学习路线图-百科:JSON替代XML
  • 考研人考研魂——英语单词篇(20231009)
  • 【数据结构】HashSet的底层数据结构
  • 数据结构与算法(七)--使用链表实现栈
  • 分布式事务详解
  • 车载通信架构 —— DDS协议介绍
  • nginx根据不同的客户端设备进行转发请求——筑梦之路
  • 增强LLM:使用搜索引擎缓解大模型幻觉问题
  • WPF向Avalonia迁移(一、一些通用迁移项目)