微服务技术栈-Nacos配置管理和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依赖

xml 复制代码
<!--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属性。

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

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

java 复制代码
    @Autowired
    private 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发起远程调用的代码:

java 复制代码
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的依赖。

xml 复制代码
<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依赖。

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

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

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

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

xml 复制代码
<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

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

java 复制代码
@Service
public class OrderService {

    @Autowired
    private 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应该扫描的包。

java 复制代码
@EnableFeignClients(basePackages = "cn.itcast.feign.client")

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


总结

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


相关推荐
lzjava20241 小时前
安装K8s集群
云原生·容器·kubernetes
luoganttcc5 小时前
[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构
分布式·架构·大模型
运维&陈同学11 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
2401_8576100313 小时前
中文学习系统:成本效益分析与系统优化
java·数据库·学习·架构
huaqianzkh13 小时前
数据流图和流程图的区别
架构·流程图
time_silence14 小时前
微服务——数据管理与一致性
微服务·云原生·架构
颜淡慕潇17 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
小小小妮子~17 小时前
深入理解 MySQL 架构
数据库·mysql·架构
雪球不会消失了18 小时前
MVC架构模式
架构·mvc
didiplus19 小时前
Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
云原生·容器·kubernetes