Nacos集群搭建(中)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Nacos集群搭建(中)

Feign远程调用



代替RestTemplate调用


RestTmplate存在的问题及其Fegin的介绍


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


•参数复杂URL难以维护


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


其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。


Fegin的使用


1)引入依赖

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


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


2)添加注解

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


1690974178981-3b7523b4-2919-4451-815f-b97fd64f3462.png


3)编写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来发送了。


4)测试

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

1690974531904-f69db470-7f8b-44ca-ac0b-bb059aca4c45.png


5)总结


使用Feign的步骤:


① 引入依赖

② 添加@EnableFe ignClients注解

③ 编写FeignClient接口

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


Feign的自定义配置


Feign可以支持很多的自定义配置,如下表所示:


image.png


一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。


一般我们也就改一改日志级别就可以了。


修改日志级别


1.通过配置文件的方式修改

基于配置文件修改feign的日志级别可以针对单个服务:


feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别

所有的:

feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别

而日志的级别分为四种:


  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间


最基本的只有请求 和 响应


1690975697515-8eced3aa-cd0c-4f2a-a4e5-46a3946064a6.png


HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据

通过Java代码的方式修改

先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}


如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
如果是局部生效,则把它放到对应的@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)


Feign使用优化


Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:


•URLConnection:默认实现,不支持连接池


•Apache HttpClient :支持连接池


•OKHttp:支持连接池


因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。


优化实例:例如Apache的HttpClient


1.引入依赖


在order-service的pom文件中引入Apache的HttpClient依赖:


<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>


1.配置连接池

在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. 日志级别尽量用basic
  2. 使用HttpClient或OKHttp代替URLConnection


① 引入feign-httpClient依赖


② 配置文件开启httpClient功能,设置连接池参数


总结


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


Feign客户端:

1690976608389-ad2ca134-adbb-45a7-b75a-2ca27865dab2.png


UserController:


1690976618698-a4311378-3c23-4ad2-bef5-d2f84128ec4f.png


这样高度耦合的代码我们如何简化呢?


方法1: 继承方式


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


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


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


1690976695339-5ae2807e-8967-40c9-8033-a77525729d18.png

优点:


  • 简单
  • 实现了代码共享


缺点:


  • 服务提供方、服务消费方紧耦合
  • 参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解


方法2: 抽取方式


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


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


1690976757737-304ae453-08f2-4f76-95e7-434f16415644.png


基于抽取的方式实现耦合代码的合并


1)抽取

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


项目结构:

1690976821105-dce73b02-bf19-4ae9-b002-d25e3e9ff43a.png


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

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

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


1690976833791-10ed3042-94f6-4f88-ae76-11340915bd3d.png


2)在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中的包


3)重启测试

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


1690976892029-f0845c46-fb63-4376-b59e-46e2469cec87.png


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


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


4)解决扫描包问题


方式一:
指定Feign应该扫描的包:
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:
指定需要加载的Client接口(FeignClient的字节码):
@EnableFeignClients(clients = {UserClient.class})

1690978760000-2e724e83-010e-4c88-88e0-41d1f6596503.png



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
存储 运维 监控
NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
【2月更文挑战第33天】NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
256 3
|
6月前
|
Java 数据库连接 Nacos
nacos常见问题之Nacos2.0.3集群模式启动报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
6月前
|
弹性计算 网络协议 IDE
Nacos报错问题之集群开启鉴权无法注册如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
|
6月前
|
Oracle 关系型数据库 Shell
Nacos部署问题之多节点集群报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
647 12
|
6月前
|
关系型数据库 MySQL 应用服务中间件
从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)
从零开始,掌握Nacos搭建的艺术(单点、集群、docker-compose)
130 0
|
3月前
|
Kubernetes 关系型数据库 MySQL
k8s部署nacos集群
k8s部署nacos集群
|
3月前
|
应用服务中间件 Nacos 数据库
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
64 1
|
3月前
|
SQL 关系型数据库 MySQL
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
108 1
|
3月前
|
关系型数据库 MySQL Nacos
Nacos 1.2.1 集群搭建(一)环境准备
Nacos 1.2.1 集群搭建(一)环境准备
81 0
|
4月前
|
Nacos 数据中心 Docker
Docker 部署 Nacos 集群
Docker 部署 Nacos 集群
下一篇
无影云桌面