【SpringCloud】微服务技术栈入门2 - Nacos框架与Feign

news2024/12/23 1:39:25

目录

    • Nacos
      • 下载 Nacos 并运行
      • 配置 Nacos
      • Nacos 集群
      • Nacos 负载均衡
      • Nacos 环境隔离
      • Nacos 注册细节
      • Nacos 更多配置项
        • 快速上手
        • 自动更新
    • Feign
      • 取代 RestTemplate
      • Feign 自定义配置
      • 性能优化

Nacos

下载 Nacos 并运行

首先下载对应的 release 包,主要要选择已经打包编译好的 nacos-server 文件!
https://github.com/alibaba/nacos/releases/tag/1.4.1

将其解压到任意一个不包含中文路径的文件夹下
进入 bin,在此文件夹下打开命令行,输入 startup.cmd -m standalone 即可开启 nacos 服务器

默认服务器端口 8848,上述指令的standalone表示为单体,非集群模式


等待命令行运行一段时间后,进入 nacos 给出的 URL:http://192.168.113.1:8848/nacos/index.html

可见这是一个管理界面,用户名和密码默认都是 nacos 登录进去即可


配置 Nacos

由于我们目前的项目设置是父子类型,首先需要在父项目 pom 导入 alibaba 工具库

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

再在各自的 server 内导入 nacos-discovery 依赖

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

非常简单吧?

最后仅需在配置文件内设置好 nacos 服务器的地址即可
和 eureka 不一样的是,这里的注册中心实际上就是我们刚刚运行的 nacos 服务器,所以无需额外创建项目来跑服务器了

配置文件书写 application.yaml

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

重新构建对应模块

回到 nacos 控制面板,就可以看见我们生成的服务器啦!

在这里插入图片描述

Nacos 集群

在这里插入图片描述

单个实例集中在一起构成一个集群

集群通常用于容灾机制

同一集群内的实例会先行访问当前集群内的其他本地实例,如果实在没办法才去找其他集群中的实例


为实例设置集群的方式很简单,只需要在配置文件添加下面的代码即可将其划入一个集群内

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

      # 设置集群名称,将这个实例归为集群SH管理
      discovery:
        cluster-name: SH

Nacos 负载均衡

假设现在有这样的状况:

  1. 服务提供方拥有 3 个实例,两个集群(BJ、NJ)
  2. 服务消费方只有 1 个实例,一个集群(BJ)

可见消费方的集群和提供方中的一个集群是一致的,所以按照常理来说我们希望消费方直接从同一集群下的提供方拿取数据


但由于 nacos 默认采用轮询的方式实现负载均衡,此时必须修改默认配置才可以实现最终效果

方案一:在 applcation.yaml 配置 ribbon,指定负载均衡采用的方法

service-consumer:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

方案二:在入口类中使用注入的方式来配置

@Bean
NacosRule nacosRule() {
    return new NacosRule();
}

负载均衡权重值设定

  1. 实例权重为 0 时,他将永远不会被访问
  2. 权重值范围 0-1
  3. 同集群内的多个实例,权重高的被访问频率变高

Nacos 环境隔离

nacos 提供了环境隔离选项
从外到内,环境由大变小依次为:命名空间->分组->服务->实例

我们先去 nacos 控制面板的“命名空间”模块随意添加一个名叫dev的命名空间,并复制一下自动生成的 ID

找到任意一个服务器的配置文件,使用 namespace 字段来将这个服务器归为某个命名空间

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: BJ

        # 设置改服务器所处的命名空间
        # 这里需要填入我们之前记下来的命名空间ID
        namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242

配置完毕,重启服务器

进入 nacos 控制台的 服务管理->服务列表
然后可以点击上方的导航条来切换命名空间

下图我们切换到了新建的 dev 命名空间,可见我们配置的 user-server 已经归为此命名空间管辖

在这里插入图片描述


Nacos 注册细节

在这里插入图片描述

服务器提供者可以向注册中心注册时选择两种状态

  1. 临时实例状态
  2. 非临时实例状态

临时实例需要主动向注册中心发送定时的心跳包来证明自己活着,否则超时了就会被注册中心剔除

非临时实例无需主动发包,而是由注册中心确认其是否活着,他会一直留着而不会因为超时等情况自己删除

nacos 集群默认使用 AP 模式,当存在非临时实例时转用 CP 模式


配置文件内使用 ephemeral 字段来标记该服务器是否为临时实例

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: BJ
        namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242

        # 设置是否为临时实例
        ephemeral: false

Nacos 更多配置项

快速上手

nacos 提供了云端设置配置文件,我们只需要在 nacos 中新建配置文件并写入需要执行热更新的配置项,然后再 springboot 应用的 bootstrap.yaml 内调用该配置即可,

新建配置文件,配置文件 ID 书写格式为:<服务器名>-<类型>.yaml
目前配置文件支持 yaml 和 properties 格式

这里的“服务器名”一定要和 springboot 中的 application 定义的 name 完全一致,才可以启用该配置项

在这里插入图片描述


为 user-server 添加 nacos-config 依赖,以便开启依赖项

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

添加 nacos-config 后,在 resource 文件夹下新建配置文件 bootstrap.yaml ,此时当 springboot 启动时,首先读取该配置文件,之后才读取 application.yaml

spring:
  # 服务器名称
  application:
    name: userservice
  # 服务器类型(我们之前定义为dev,这里必须写dev)
  profiles:
    active: dev

  # 其他关键性配置
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        # 设置bootstrap配置文件的后缀名
        file-extension: yaml
      discovery:
        cluster-name: BJ
        namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242
        ephemeral: false

之后来到 UserController.java 拉取配置文件信息

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Value("${pattern.dataformat}")
    private String dataFormat;

    @GetMapping("/now")
    public String now() {
        // 由于我们之前在nacos中设置的配置项配置了pattern属性,这里就可以直接调用对应的属性完成时间格式化了
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataFormat));
    }
}

自动更新

直接在 nacos 中使用配置文件的好处是可以实时实现热更新,而不像是在项目中设置 application.yaml 后还要在重启一次

我们仅需在使用了 nacos 配置文件的 bean 内添加注解 @RefreshScope 即可

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope // 添加检测配置文件更新的注解
public class UserController {}

或者你可以创建一个自定义的配置类还动态获取指定配置

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dataFormat;
}

我们可以专门配置指定运行环境(比如 dev)的配置文件:userservice-dev.yaml
或者定义服务器全局(所有环境通用)的配置文件:userservice.yaml

配置文件之间的优先级:带环境参数的配置文件>全局配置文件>application.yaml


Feign

取代 RestTemplate

相比于 resttemplate 低效的字符串拼接,feign 提供了接口操作的形式,让我们更加直观的连接到对应的服务器提供者

首先引入依赖

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

务必记住在入口类中开启 feign 客户端

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients // 开启feign客户端
public class OrderApplication {}

创建一个接口类,用于获取服务器提供者的接口

代码清单:clients/UserClient.java

// 注解内填入需要链接到的服务器名称
@FeignClient("userservice")
public interface UserClient {
    // 表示使用GET请求获取数据
    @GetMapping("/user/{id}")
    // 同理PathVariable用来填补上方路径中的id占位符
    User findById(@PathVariable("id") Long id);
}

最终在 service 重写查询逻辑

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 查询订单
        Order order = orderMapper.findById(orderId);
        // feign客户端请求user数据库中内容
        User user = userClient.findById(order.getUserId());
        order.setUser(user);
        return order;
    }
}

运行 orderservice 之后,浏览器输入 http://localhost:10087/order/101 即可获取对应的数据了!实际上你看出来的效果和 resttemplate 差不多


Feign 自定义配置

配置日志输出级别

全局配置

feign:
  client:
    config:
      default:
        loggerLevel: FULL

局部配置(明确指出服务器名称)

feign:
  client:
    config:
      userservice:
        loggerLevel: FULL

或者你可以使用代码的方式来书写

在这里插入图片描述


性能优化

借助 URLConnection 连接池来取代原本的单链接,可以提升 feign 客户端的效率

导入 feign-httpclient 坐标

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

之后配置文件配置好属性即可

feign:
  client:
    config:
      default:
        # 日志级别最好使用BASIC或者NONE,其他的级别比较耗费性能而且基本用不上
        loggerLevel: BASIC
  httpclient:
    enabled: true
    max-connections: 200
    max-connections-per-route: 50

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

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

相关文章

链表的回文判断

思路: 找中间节点–>逆置->比较 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) { struct ListNode*slowhead; struct ListNode*f…

maven多模块依赖包程序包xxx不存在

背景 rpc-common 被 rpc-server、rpc-client依赖 项目地址 https://github.com/pjmike/springboot-rpc-demo mvn clean install 打包时报错 报错信息 程序包xxxx不存在 找不到符号 原因分析 原因还不清楚&#xff0c;网友们帮解答一下 解决 主pom.xml 添加 <packaging…

23个销量最高的3D扫描仪【2023】

如果你可以 3D 扫描它&#xff0c;你就可以 3D 打印它。 市场上 3D 扫描仪的种类和质量非常丰富&#xff0c;机器尺寸、功能和价格各异。 这样的选择虽然本身是一件很棒的事情&#xff0c;但也会让从无用的东西中挑选出宝石成为一件苦差事。 推荐&#xff1a;用 NSDT编辑器 快速…

如何在linux定时备份opengauss数据库(linux核心至少在GLIBC_2.34及以上)

前提环境&#xff0c;linux的核心至少在GLIBC_2.34及以上才能使用。 查看linux的glibc版本的命令如下 strings /lib64/libc.so.6 | grep GLIBC 如下图 或者用ldd --version 如下图 在官网下载对应的依赖包&#xff0c; 只需要这个lib文件即可&#xff0c;将这个包放在lin…

拓世法宝|短视频带货风潮,数字人教育书单号成销售黑马

Z世代的爸妈&#xff0c;正在搞一种很新的育儿方式。 “躺平式”带娃、“用魔法打败魔法”等新时代育儿方式频频登上热搜&#xff0c;作为与互联网共同成长起来的一代&#xff0c;Z世代父母们更热衷于通过网络攻略获得和分享知识和经验&#xff0c;更注重个性的养育方式&#…

ChatGPT所引用的参考文献根本不存在?如何正确使用AI工具?

从ChatGPT推出以来&#xff0c;一直都是一个热点话题&#xff0c;尤其是在高等教育领域&#xff0c;大家展开了非常激烈的讨论。 巴斯大学对ChatGPT进行测试时发现&#xff0c;ChatGPT生成的论文&#xff0c;其参考文献的引用格式看起来很完美&#xff0c;有作者姓名和期刊名称…

文件、预处理、位运算

10.2 数据文件概述 10.2.1 ASCII文件与二进制文件 ASCII文件就是“将需要保存到文件的信息使用ASCII字符表示&#xff0c;然后按照顺序将每个字符的ASCII码存储到文件中”。ASCII文件的优点是编码方式公开&#xff0c;可以被其它的文本编辑器打开&#xff1b;其缺点是效率比较…

第一章 计算机网络基础

目录 1.1 网络体系结构 1.1.1 OSI/RM七层参考模型 1.1.2 OSI/RM和TCP/IP模型的比较 1.1.3 五层协议的体系结构 1.1.4 计算机1向计算机2发送数据过程 1.1.5 TCP/IP体系结构的具体实现 1.2 网络设备概述 1.2.1 互联设备与OSI的对应关系 1.2.2 集线器(HUB) 1.2.3 网桥(B…

新势力在智能化路上,正抢了Tier 1的生意

作者 | Amy 编辑 | 德新 上半年的汽车行业价格内卷&#xff0c;下半年则一下资本涌入&#xff0c;风起云涌。 先是蔚来拿到了11亿美元来自中东的投资&#xff0c;紧接着7月大众以7亿美元投资小鹏汽车&#xff0c;8月哪吒完成70亿元Crossover轮投资。传闻中&#xff0c;还有大众…

GE IS220PAICH2A 336A4940CSP11 控制脉冲模块

GE IS220PAICH2A 336A4940CSP11控制脉冲模块是一种用于工业自动化和控制系统的模块&#xff0c;通常用于监测和生成脉冲信号&#xff0c;以控制各种设备和过程。以下是可能与该控制脉冲模块相关的一些产品功能&#xff1a; 脉冲生成&#xff1a;GE IS220PAICH2A 336A4940CSP11控…

JCEF中js与java交互、js与java相互调用

jcef中js与java相互调用&#xff0c;java与js相互调用&#xff0c;chrome与java相互调用&#xff0c;java与chrome相互调用、jcef与java相互调用 前提&#xff1a;https://blog.csdn.net/weixin_44480167/article/details/133170970&#xff08;java内嵌浏览器CEF-JAVA、jcef、…

天玑科技PBData信创数据库私有云平台荣获“专题展优秀成果奖”

9月15-16日&#xff0c;由湖南省人民政府、工业和信息化部联合主办的2023世界计算大会在湖南长沙盛大启幕。天玑科技作为云服务、信息技术应用创新领域优秀的解决方案提供商受邀参会参展。 大会以“计算万物 湘约未来——计算产业新变革”为主题&#xff0c;全国政协副主席、民…

GE IS420UCSCH2A-C-V0.1-A模拟量输入模块

GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块是一种用于数据采集和监测的电子模块&#xff0c;通常应用于工业控制系统、监测设备和自动化系统中。以下是可能与该模拟量输入模块相关的一些产品特点&#xff1a; 多通道输入&#xff1a; GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块通…

这个世界,永远靠实力说话

这个世界&#xff0c;永远靠实力说话。与其寄望于运气或机会的降临&#xff0c;还不如脚踏实地&#xff0c;努力提升自己。因为只有强者&#xff0c;才能在这个充满挑战和机遇的世界里谈笑风生&#xff0c;创造出属于自己的成功和辉煌。 就比如峰民dyfm888给人取名改名&#x…

基于Java的Base64编解码优化探讨

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

腾讯云16核CPU服务器配置大全,CVM和轻量服务器

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

如何搭建数据驱动自动化测试框架?

前言 说到数据驱动自动化测试&#xff0c;你会不会有这样的疑问&#xff1a;数据怎么管理&#xff1f;数据怎么才能驱动测试用例执行&#xff1f;到底怎么样才算数据驱动&#xff1f;那么本篇文章就教你如何进行数据驱动测试&#xff0c;相信你一定能对数据驱动自动化测试有一…

【Java 集合】常用的Java集合框架体系详解(134)

一、集合的体系 概述&#xff1a;java中存储对象数据的一种容器&#xff0c;集合只能存储引用类型的数据。用泛型来规定需要操作元素的数据类型&#xff0c;可以在编译阶段约束集合只能操作某种数据类型。集合分为两个家族 MAP和Collection 特点&#xff1a;大小不固定&#…

YOLOv8 YOLOv7 YOLOv5 训练 SCB-Dataset3-U

目录 0 相关资料1 SCB-Dataset3-U 数据2 YOLOv8 训练2.1 YOLOv8 安装2.2 训练的yaml文件2.3 YOLOv8 训练2.3.1 yolov8n 训练2.3.2 yolov8n 验证 0 相关资料 YOLOV8环境安装教程.&#xff1a;https://www.bilibili.com/video/BV1dG4y1c7dH/ YOLOV8保姆级教学视频:https://www.…

实施预测性维护解决方案的挑战及PreMaint的应对方法

前面我们介绍了企业选择预测性维护解决方案的常见问题和PreMaint的策略&#xff0c;本期我们将带来实施过程中可能会遇到的挑战&#xff0c;以及如何通过PreMaint来应对这些挑战&#xff0c;以实现可靠的预测性维护。 随着工业技术的不断进步&#xff0c;预测性维护作为一种先进…