Matuto的博客

Matuto的博客

马图图

岁月变迁何必不悔,尘世喧嚣怎能无愧。

25 文章数
1 评论数

微服务注册中心 - Nacos + OpenFeign

马图图
2024-06-23 / 0 评论 / 2162 阅读 / 0 点赞

微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。 微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:

  • 粒度小
  • 团队自治
  • 服务自治

服务拆分原则

从拆分目标来说,要做到:

  • 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
  • 低耦合:每个微服务的功能要相对独立,尽量减少对其他微服务的依赖。

从拆分方式来说,一般包含两种方式:

  • 纵向拆分:按照业务模块来拆分
  • 横向拆分:抽取公共服务,提高复用性

注册中心

nacos

服务注册

引入 nacos 依赖

<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
</dependency>

配置 nacos 地址

spring:  
  application:  
    name: item-service # 微服务环境 服务名称  
  cloud:  
    nacos:  
      server-addr: 192.168.10.150:8848

服务发现

服务发现前两步与服务注册一致,需要引入依赖、配置地址。 服务发现

private final DiscoveryClient discoveryClient;

private void handleCartItems(List<CartVO> vos) {
	// 根据服务名称,拉取服务的实例列表  
	List<ServiceInstance> instances = discoveryClient.getInstances("item-server");  
	  
	ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));  
	URI uri = serviceInstance.getUri();
}

OpenFeign

快速入门

早期的负载均衡使用的是 SpringCloud 中的 Ribbon 现在用的是新版本的 loadbalancer

Feign 会自动调用 loadbalancer 进行负载均衡

引入依赖

  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>

开启注解 - 加到启动类上

@EnableFeignClients  
@SpringBootApplication  
public class CartApplication { // 略}

编写 FeignClient

@FeignClient("item-service")  
public interface ItemClient {  
  
    @GetMapping("/items")  
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);  
}

使用 FeignClient 实现远程调用

private final ItemClient itemClient;

List<ItemDTO> items = itemClient.queryItemByIds(itemIds);

连接池

默认使用的 JDK 的 URLConnection, 不带连接池,性能比较差

OpenFeign 对 Http 请求做了伪装,http 请求依赖其他框架,可以自己选择,包括以下三种:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

整合 OKHttp 引入依赖

<dependency>  
    <groupId>io.github.openfeign</groupId>  
    <artifactId>feign-okhttp</artifactId>  
</dependency>

开启连接池

feign:  
  okhttp:  
    enabled: true # 使用okhttp

最佳实践

常用的解决方案,

  • 将每一个业务模块再次拆分,拆分为三个模块,dto、api、biz,这种方式耦合度更低,但是代码结构比较复杂,在企业级开发中用的比较多。
  • 抽出一个公共的 api 模块,每一个需要远程调用的工程,都需要引入 api 模块,这样耦合度高一点

解决方案的选择,需要看项目选择的拆分方式。

当定义的 FeignClient 不在 SpringBootApplication 的扫描包范围时,这些 FeignClient 无法使用。有两种解决方式:

  • 指定 FeignClient 所在包 @EnableFeignClients(basePackages = "com.matuto.api.clients")
  • 指定 FeignClient 字节码 @EnableFeignClients(clients = {UserClient.class})

日志输出

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

  • ONONE: 不记录任何日志信息,这是默认值。
  • BASIC: 仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS: 在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL: 记录所有请求和响应的明细,包括头信息、请求体、元数据。

要自定义日志级别需要声明一个类型为 Logger.Level 的 Bean,在其中定义日志级别:

public class DefaultFeignConfig {  
  
    @Bean  
    public Logger.Level feignLoggerLevel() {  
        return Logger.Level.FULL;  
    }  
}

但此时这个Bean并未生效,要想配置某个FeignClient的日志,可以在@FeignClient注解中声明:

@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)

如果想要全局配置,让所有 FeianClient 都按照这个日志配置,则需要在 @EnableFeianClients 注解中声明:

@EnableFeignClients(basePackages = "com.hmall.api.clients", defaultConfiguration = DefaultFeignConfig.class)
上一篇 下一篇
评论
来首音乐
最新回复
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
文章目录
每日一句