[GN] 微服务开发框架 --- 配置中心的应用 (24.1.2)


前言

考研狗回顾开发知识,准备春招了 😥😥😥

提示:以下是本篇文章正文内容,下面案例可供参考

以下内容 依托此结构
在这里插入图片描述

1.配置管理

总览

1.1统一配置管理

在这里插入图片描述

1.1.1nacos中添加配置文件

在这里插入图片描述

1.1.2从微服务拉取配置

nacos与本地的application.yml配置合并,才能完成项目启动。

但如何读取application.ym,l

spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取

在这里插入图片描述

  1. 在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 添加bootstrap.yaml 在user-service中

    三部曲

    spring:
      application:
        name: userservice # 服务名称
      profiles:
        active: public #开发环境,这里是public 
      cloud:
        nacos:
          server-addr: localhost:8848 # Nacos地址
          config:
            file-extension: yaml # 文件后缀名
    
  2. 使用@Value(@NacosValue)读取配置信息

在这里插入图片描述

1.2 配置热更新

总览

1.2.1方式一

在@Value注入的变量所在类上添加注解@RefreshScope:

在这里插入图片描述

1.2.1方式二

使用@ConfigurationProperties注解代替@Value注解。

  1. 在user-service服务中,添加个PatternProperties类,读取patterrn.dateformat属性:
package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component //将此类bean
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
  1. 在UserController中使用这个类代替@Value:

在这里插入图片描述

1.3配置共享

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

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

  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

  1. 在nacos中添加一个userservice.yaml文件:

该文件名不包含[spring.profiles.active]
在这里插入图片描述

该配置在所有userservice中 都可读取到 。不用管环境

  1. user-service中读取共享配置

修改PatternProperties类
在这里插入图片描述

调用该方法

在这里插入图片描述

1.2Feign远程调用

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

•代码可读性差,编程体验不统一

•参数复杂URL难以维护

在这里插入图片描述

使用Feign的步骤:

① 引入依赖

② 添加@EnableFeignClients注解

③ 编写FeignClient接口

④ 使用FeignClient中定义的方法代替RestTemplate

1.2.1 Feign替代RestTemplate

Fegin的使用步骤如下:

  1. 引入依赖

我们在order-service服务的pom文件中引入feign的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 添加注解

在order-service的启动类添加注解开启Feign的功能:

在这里插入图片描述

  1. 编写Feign的客户端

在order-service中新建一个接口,内容如下:

package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

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

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

  1. 测试

修改order-service中的OrderService类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

在这里插入图片描述

是不是看起来优雅多了。

1.2.2 Feign使用优化

总览

我们要改成使用连接池的实现 因为http连接释放都要握手耗费timw

我们用Apache的HttpClient来演示。

  1. order-service的pom文件中引入Apache的HttpClient依赖
<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2、 order-service的application.yml中添加配置:

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数
1.2.3 最佳实践

观察可以发现,Feign的客户端与服务提供者的controller代码非常相似:

  • feign客户端:

在这里插入图片描述

  • UserController:

在这里插入图片描述

重复写代码的问题

1.2.3.1 继承方式

一样的代码可以通过继承来共享:

1)定义一个API接口,利用定义方法,并基于SpringMVC注解做声明。

2)Feign客户端和Controller都集成改接口

在这里插入图片描述

优点:

  • 简单 实现了代码共享

缺点:

  • 服务提供方、服务消费方紧耦合

  • 参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解

1.2.3.2 抽取方式

将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

在这里插入图片描述

  1. 抽取

首先创建一个module,命名为feign-api:

在这里插入图片描述

项目结构:

在这里插入图片描述

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

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

然后,order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

在这里插入图片描述

  1. 在order-service中使用feign-api

首先,删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。

在order-service的pom文件中中引入feign-api的依赖:

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

修改order-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的包

  1. 重启测试

重启后,发现服务报错了:

在这里插入图片描述

这是因为UserClient现在在cn.itcast.feign.clients包下,

而order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一个包,无法扫描到UserClient。

  1. 解决扫描包问题

方式一:

指定Feign应该扫描的包:

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

方式二:

指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})

2. 总结

微服务配置中心两种方法: 更建议后者

  • 通过注解方式
  • 通过调用实现类

下章更网关部分!

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GGood_Name

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值