一文学习nacos和openFeign

目录

为什么需要nacos

微服务架构是目前流行的企业技术架构,多个服务由之前部署在一个服务器,开发在同一个程序中,到目前各自部署到不同的服务器中,每个微服务与其他微服务解耦,微服务之间互相调用构成企业技术架构,协同完成企业业务需求;

那具体怎么调用是关键,某些微服务比较核心,比如支付服务,访问量很大,为了避免服务器负载过大夯机,一般会把服务部署在多台服务器实例中,那其他微服务调用时应该调用哪个实例?这是个问题

注册中心原理

为了解决这个问题,方便微服务之间互相调用,注册中心应运而生,简单来说注册中心就是微服务启动之后把服务名、服务器实例IP和端口注册到注册中心,其他服务调用时直接通过被调用的微服务名称从注册中心拿到被调用微服务的所有实例,然后通过负载均衡算法从其中选择一个实例去调用,就是这么简单。

  1. 服务提供者:提供接口供其它微服务访问
  2. 服务消费者:调用其它微服务提供的接口
  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)
  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除
  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表
  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

nacos注册中心

注册中心的产品有很多,目前国内用nacos还是多一些,nacos是阿里的产品,中文文档会多一些。

nacos安装

建议使用docker安装

  1. docker pull nacos 下载nacos镜像
  2. 创建挂载目录
  3. docker run 创建容器,部署应用
  4. 配置mysql数据库,更改nacos配置,走配置的mysql数据库
  5. 重启nacos

服务注册/调用

nacos使用起来很简单,只要导入起步依赖,配置nacos地址即可

  1. 导入依赖
xml 复制代码
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 在yaml配置文件配置nacos地址
yaml 复制代码
spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848 # nacos地址
  1. 在不用openFeign之前,spring cloud会自动为容器自动装配服务发现组件DiscoveryClient,我们通过这个组件和服务名称就能从nacos中找到这个服务的所有实例,然后通过
  2. 均衡算法,确定一个实例,发送请求即可。

openFeign远程调用

上面这种方式虽然可行,但是实现方式比较繁琐,openFeign提供了一种更为简便的方式实现服务间远程调用,简单说就是写openFeign接口,将http协议最重要的请求方式、URL、请求参数、响应体类型写到接口上 ,然后基于动态代理将代理对象注册到IOC容器中,直接调用openfeign代理对象方法即可实现远程调用。
1. 引入依赖

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

2. 定义openfeign客户端接口

java 复制代码
package com.hmall.cart.client;

import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient("item-service")
public interface ItemClient {
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
  1. @FeignClient("item-service") :声明服务名称
  2. @GetMapping("/items") :声明请求方式和请求路径
  3. @RequestParam("ids") Collection<Long> ids :声明请求参数
  4. List<ItemDTO> :响应体解析类型

3. 使用openfeign客户端

java 复制代码
public class Service{
	@Autowired
	private ItemClient itemClient;
	public void test(){
		List<Long> items = Arrays.asList(1l,2l);
		List<ItemDTO> res = itemClient.queryItemByIds(items);
	} 
}

4. 日志管理

只有包的日志级别是debug时,openFeign的日志才会生效 ,此外,还需要单独配置openFeign的日志级别,openFeign的日志级别有4级,Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
java 复制代码
//1.定义openFeign配置类
import feign.Logger;
import org.springframework.context.annotation.Bean;

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

// 单独配置到某个feignclient接口,或者全局配置
@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
//全局配置
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
相关推荐
wdfk_prog11 分钟前
[Linux]学习笔记系列 -- [arm][lib]
linux·运维·arm开发·笔记·学习
艾莉丝努力练剑13 分钟前
深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
c语言·开发语言·c++·学习
晨非辰1 小时前
#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
c语言·开发语言·经验分享·学习·其他·学习方法·visual studio
帅得不敢出门2 小时前
Android Framework定制长按电源键关机的窗口
android·java·framework
fatfishccc2 小时前
循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
xml·java·数据库·spring·intellij-idea·ioc·di
小厂永远得不到的男人2 小时前
一篇文章搞懂 java 反射
java·后端
鼠鼠我捏,要死了捏2 小时前
基于Spring Boot与gRPC的高性能微服务架构设计分享
spring boot·微服务·grpc
Include everything2 小时前
Rust学习笔记(一)|Rust初体验 猜数游戏
笔记·学习·rust
Warren982 小时前
公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
java·开发语言·前端·javascript·vue.js·python·安全