【微服务】分布式组件 Nacos 结合 Feign 的使用

news2025/1/14 19:36:48

本文主要介绍如何搭建分布式开发基本环境

一、基本概念

在这里插入图片描述

1. 注册中心

在分布式系统中,每一个微服务上线,都需要注册到注册中心。(方便服务的远程调用,比如订单想调用商品服务,直接从注册中心获得)

对应 SpringCloud 里的 Netflix 组件中的 Eureka

2. 配置中心

用于集中管理配置,服务实时获取配置中心的配置,进行修改

对应 SpringCloud 里的 Spring Cloud Config 组件

3. 网关

前端请求经过网关进行鉴权、过滤等操作

对应 SpringCloud 里的 Netflix 组件中的 Zuul

二、分布式使用的组件

我们不使用 SpringCloud 原生组件,而是使用 SpringCloud Alibaba 中提供的组件

原因:SpringCloud 中的部分组件停止维护了,并且环境搭建复杂。而 SpringCloud Alibaba 具有完善的可视化界面,学习曲线低。

最终我们需要用的组件为:

  1. Nacos —— 注册配置中心
  2. Ribbon + Feign —— 远程调用 、负载均衡
  3. Sentinel —— 服务熔断降级
  4. GateWay —— API 网关
  5. Sleuth —— 调用链监控
  6. Seata —— 分布式事务

三、Nocas + Feign 基本使用

Nocas 示例文档: https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/README-zh.md

1. 导入 spring-cloud-alibaba 组件

   <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-alibaba-dependencies</artifactId>
       <version>2.2.9.RELEASE</version>
       <type>pom</type>
       <scope>import</scope>
   </dependency>

2. 使用 Nacos 组件作为注册中心

1) 导入依赖到我们微服务项目的聚合服务

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

2) 下载 Nacos 服务器
https://nacos.io/zh-cn/docs/quick-start.html

如果安装了 git ,可以使用 git 下载

git clone https://github.com/alibaba/nacos.git

解压后,通过 cmd 启动 bin 目录
在这里插入图片描述
然后通过下列命令启动

 startup.cmd -m standalone

在这里插入图片描述

3)在项目中注册微服务到 Nacos 中

  • 在需要注册到配置中心的微服务项目 yml 文件中配置 Nocos 服务器地址以及当前服务名
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: mall-coupon
  • 在项目启动类中加入 @EnableDiscoveryClient 注解

4)访问 nacos 客户端首页,地址为http://127.0.0.1:8848/nacos —— Nacos 初始登录名和登录密码都为 nacos

3. 使用 Feign 进行服务的远程调用

Feign : 一个声明式的 HTTP 客户端

使用 Feign 远程调用其他服务步骤:

1) 导入 openfeign 依赖

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

2) 创建 feign 包,在里面编写一个接口,其作用是告诉 springcloud,这个接口需要调用远程服务

3) 在接口中声明接口的每个方法调用的是远程服务的那个请求

代码示例:

package com.wanqing.mall.member.feign;

import com.wanqing.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient("mall-coupon") // 找 mall-coupon 位置
public interface CouponFeignService {

   @RequestMapping("coupon/coupon/member/list")
    public R memberCoupons();
}

解释:

  • 在需要调用远程服务的接口处 ,使用 @FeignClient(“远程服务名”) 注释
  • 接口中声明的方法为远程服务中的方法名

4)通过在项目启动类中加入@EnableFeignClients(basePackages = "feign包位置") 注释,开启远程调用功能

@EnableFeignClients(basePackages = "com.wanqing.mall.member.feign")

4. 使用 Nocas 作为配置中心

1)引入 Nacos 作为配置中心的依赖

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

2)创建 bootstrap.properties 文件,bootstrap.properties 文件内容为微服务名字和配置中心地址

spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

bootstrap.properties 文件创建位置:

在这里插入图片描述

3)需要给配置中心中添加一个数据集 Date-Id, 其默认名字为 应用名.properties ,然后为这个数据集中添加所有配置

在这里插入图片描述

4)在服务中设置动态获取并刷新配置 —— 优先使用配置中心的配置

  • 在需要动态获取配置的类前加入 @RefreshScope 注解
	@RefreshScope
  • 使用 @Value("${配置项的值}") 获取配置的值
    @Value("${user.uname}")

5. Nocas 配置中心细节

5.1 命名空间

命名空间的核心是为了实现配置隔离,其默认为 public , 默认新增的配置都在 public 空间下

  1. 命名空间可实现环境隔离

通过在 bootstrap.properties 配置文件中加入命名空间的唯一 id 配置,修改获取配置的命名空间

spring.cloud.nacos.config.namespace=cc753734-cca7-4ff0-b332-f627b34502dc

通过命名空间,可实现 开发环境、生产环境、测试环境的 隔离
在这里插入图片描述

  1. 基于每个微服务间互相隔离配置,即每个微服务都创建自己的命名空间
5.2 配置集

所以配置的集合就是配置集,类似配置文件

5.3 配置集 ID

配置集 ID 就是配置文件名字

5.4 配置分组

默认所有的配置集都属于 DEFAULT_GROUP

在创建配置时,可设置配置组,对不同的情况,我们可以使用不同的配置组的配置文件

通过在 bootstrap.properties 配置文件中加入配置组的唯一 id 配置,修改获取配置的配置组

spring.cloud.nacos.config.group=1111

命名空间和配置组项目中的用法:

  1. 每个微服务有其自己的命名空间
  2. 对每个微服务的命名空间使用配置分组区分其环境

在这里插入图片描述

# 该微服务的命名空间
spring.cloud.nacos.config.namespace=69fca09f-2013-433a-83fd-8d4397eff83c 
# 该微服务当前配置使用的组
spring.cloud.nacos.config.group=dev
5.5 加载多配置集

在项目中,对不同位置的配置拆分成不同的配置文件

例如,将完整的 application.yml 文件拆分成关于数据源的,关于 mybatis 的配置文件 和其他等等配置,将其加入到 Nocas 中

在这里插入图片描述

通过在 bootstrap.properties 配置文件中加入如下配置,动态获取配置中心中的配置

# 加入配置文件及其分组
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
# 配置动态刷新
spring.cloud.nacos.config.extension-configs[0].refresh=true 

总结: 我们可以将微服务中所有配置配置到配置中心中,项目中只保留一 bootstrap.properties 配置文件即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合mybatis

SpringBoot整合mybatis 以tb_book表格为例&#xff1a; 第一步&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 第二步&#xff1a;选择当前模块需要使用的技术集&#xff08;MyBatis、MySQL&#xff09; 或者手工导入对应技术的star…

idea创建纯净的maven项目简单的maven工程

idea创建简单的maven项目一、说在前面二、创建步骤一、说在前面 在学习或者开发中&#xff0c;有时候&#xff0c;我们只想创建一个简单的maven工程&#xff0c;不需要有太多的自带的配置或配置文件&#xff0c;本文结合这一需求&#xff0c;将创建步骤分享给大家&#xff0c;…

Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件

1、UI测试框架搭建-目录结构 2、 文件介绍 2.1、baseinfo->__init__.py 配置文件定义基础参数 #-*-coding:utf-8-*- #测试用例配置参数base_url "http://xxxxx.com" undirect_username "username" undirect_password "password" direct_…

想知道怎么给图片加贴纸?手把手教你给图片加贴纸

有时候我们在拍摄照片时&#xff0c;会不小心排到一些隐私的东西&#xff0c;这个时候该怎么办呢&#xff1f;可能很多人会先想到使用马赛克涂抹&#xff0c;这个方法确实好&#xff0c;但马赛克在帮我们遮挡的同时&#xff0c;也会影响到图片的整体观感。那我们应该用什么来代…

WebRTC Pacer

目录 一. 前言 二. WebRTC Pacer 1. 数据包传入Pacer模块的队列 2. Pacer模块取出队列的包发送 &#xff08;1&#xff09;什么时候取出数据包发送 &#xff08;2&#xff09;每次发送多少数据量 &#xff08;3&#xff09;避免引入较大延时的处理方法 一. 前言 实时音视…

@MapperScan 和 @Mapper 源码走读

一.从开发中遇到的问题开始 问题描述 : 在一个springbootmybatis的项目中,在dao也就是Mapper接口上配置了Mapper注解&#xff0c;其他同事在启动类还配置了MapperScan注解&#xff08;包扫描没有配全面&#xff09;&#xff0c;进行批量指定所生成的Mapper接口动态代理接口类&…

TFT-LCD移植LVGL详细过程记录

TFT-LCD移植LVGL LVGL(轻量级和通用图形库)是一个免费和开源的图形库&#xff0c;它提供了创建嵌入式GUI所需的一切&#xff0c;具有易于使用的图形元素&#xff0c;美丽的视觉效果和低内存占用。 LVGL更多介绍&#xff1a;https://zhuanlan.zhihu.com/p/406294618 本次实验…

第六章 图论 16 AcWing 1558. 加油站

第六章 图论 16 AcWing 1558. 加油站 原题链接 AcWing 1558. 加油站 算法标签 图论 最短路 枚举 思路 枚举加油站位置&#xff0c;对于每个加油站位置进行dijkstra&#xff0c;选择符合要求1的最小距离最大值&#xff08;要求2&#xff09;与的距离和最小值&#xff08;要…

(九)Java算法:快速排序(详细图解)

目录一、前言1.1、概念1.2、算法过程二、maven依赖三、流程解析3.1、全部数据分区3.2、左边数据分区3.3、右边数据分区四、编码实现结语一、前言 1.1、概念 快速排序&#xff1a;用数组的第一个数作为基准数据&#xff0c;然后将所有比它小的数都放到它左边&#xff0c;所有比…

使用 Spring Boot 设置 Hibernate Envers

Hibernate Envers是一个实现持久实体的审核和版本控制的模块。审计和版本控制是构建生产级Spring 启动微服务的关键组件。Hibernate Envers与Spring Boot无缝集成以实现相同的目标。 在这篇文章中&#xff0c;我们将在我们的Spring Boot Starter应用程序中集成Hibernate Envers…

生信工作流框架搭建 | 02-nextflow 实战

目录生信工作流框架搭建 | 02-nextflow前情提要开始使用依赖安装核心概念一个fastqc的示例&#xff0c;加深理解快速搭建你的程序你需要仔细阅读的&#xff1a;可以快速浏览&#xff08;但需要知道大概有什么&#xff0c;以便后来查览&#xff09;&#xff1a;报错&#xff01;…

IPD-需求管理流程

一、产品需求管理模型 在确定客户需求时,要考虑影响用户购买标准的八类基本需求($APPEALS),并基于客户视角进行详细分解,形成有针对性的产品。 1.1、需求管理业务流程 二、需求收集流程 2.1、需求收集的来源 路标规划:通过市场管理流程分析,落实到路标规划中的需求…

基于Paddle的手写数字识别模型

百度飞桨(paddlepaddle)是百度的开源深度学习平台&#xff0c;今天就利用paddle来编写入门级的手写数字模型&#xff0e; 一&#xff0c;准备数据 下载数据集&#xff0c;这里我们使用的是MNIST数据集 # 下载原始的 MNIST 数据集并进行解压 wget https://paddle-imagenet-mode…

12.数组的初始化和引用

数组的初始化 定义数组的时候&#xff0c;顺便给数组的元素赋予初值&#xff0c;即开辟空间的同时并且给数组元素赋值 一维数组的初始化 a. 全部初始化 int a[5] {2,4,7,8,5}; 代表的意思&#xff1a;a[0] 2 , a[1] 4 , a[2] 7 , a[3] 8, a[4] 5; b. 部分初始化 int …

Clever Internet Suite for Delphi, C++Builder

为Internet应用程序添加即时SSL/TLS安全性&#xff0c;并实现许多有用的Internet相关功能。 聪明的互联网套件允许您添加下载、上传和提交互联网资源;发送和接收MIME消息;HTTP、FTP、SMTP、POP3、IMAP和NNTP客户端/服务器解决方案;带有数字证书的SSL/TLS通道支持您的VCL应用程序…

电脑分辨率怎么调?电脑分辨率怎么调合适

​无论是笔记本电脑的用户&#xff0c;还是说台式电脑的用户&#xff0c;在使用电脑的时候&#xff0c;如果电脑分辨率调整的不对&#xff0c;很容易造成显示与观感方面的模糊。电脑分辨率怎么调&#xff1f;电脑分辨率怎么调最佳&#xff1f;本篇文章&#xff0c;小编就来教教…

ASEMI肖特基二极管1N5822参数,1N5822特征,1N5822应用

编辑-Z ASEMI肖特基二极管1N5822参数&#xff1a; 型号&#xff1a;1N5822 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;40V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;28V 最大直流阻断电压&#xff08;VDC&#xff09;&#xff1a…

三、简单了解kafka设计原理

系列文章目录 文章目录系列文章目录一、Kafka核心总控制器Controller二、kafka高性能简单理解一、Kafka核心总控制器Controller 在Kafka集群中会有一个或者多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controller&#xff09;&#xff0c;它负责…

[ZJCTF 2019]Login--动态调试--详细版

前言 主要是因为太菜了&#xff0c;看了别人的exp&#xff0c;还是懵懵懂懂的&#xff0c;都是静态分析&#xff0c;不明白为会在改密码的时候会导致最后的getshell。今天给它动态分析整一个&#xff0c;看看到底哪里出错了。 基本原理 网上有很多介绍的&#xff0c;在这里说…

Linux学习——01 gcc编译器

一、程序构建过程 高级语言的代码无法被计算机执行&#xff0c;需要将高级语言代码编译成汇编语言&#xff0c;然后再将汇编语言翻译成机器指令&#xff0c;最后通过链接生成最后的可执行文件&#xff0c;此时该文件才可以被计算机执行。总共有四步&#xff1a; 1.1 预编译&a…