• 微服务技术栈-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依赖

    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2)添加bootstrap.yaml

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

    @Data
    @Component
    @ConfigurationProperties(prefix = "pattern")
    public class PatternProperties {
        private String dateformat;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

        @Autowired
        private PatternProperties patternProperties;
    
        @GetMapping("/now")
        public PatternProperties now(){
            return patternProperties;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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);
    
    • 1
    • 2

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

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

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

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

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

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

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

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

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

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

    @FeignClient("userservice")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id")Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    <dependency>
        <groupId>cn.itcast.demogroupId>
        <artifactId>feign-apiartifactId>
        <version>1.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

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

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

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


    总结

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


  • 相关阅读:
    10道高频webpack面试题快问快答
    单纯形法实现(GUI based on Matlab)全部的源代码
    Java版本+企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势
    Open3D(C++)快速欧式聚类分割
    3.rsync备份案例
    Httpservletrequest与Httpservletresponse
    Spring学习之ImportBeanDefinitionRegistrar接口
    Redis(五)
    释放Sqlite数据库占用的多余空间
    Java很简单的文件上传(transferTo方式)
  • 原文地址:https://blog.csdn.net/qq_52173163/article/details/133560135