SpringCloud Alibaba - Eureka注册中心,Nacos配置中心

Eureka

1、创建服务端

server:port: 8761 # eureka 默认端口spring:application:name: eureka-server # 应用名称(微服务中建议必须定义应用名称)

@SpringBootApplication
@EnableEurekaServer // 开启eureka注册中心功能
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}

2、创建客户端 

# 应用服务 WEB 访问端口
server:port: 8080spring:application:name: eureka-client-aeureka:client:service-url: # 指定注册地址defaultZone: http://localhost:8761/eureka
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientBApplication {public static void main(String[] args) {SpringApplication.run(EurekaClientBApplication.class, args);}}

# 应用服务 WEB 访问端口
server:port: 8081spring:application:name: eureka-client-beureka:client:service-url: # 指定注册地址defaultZone: http://localhost:8761/eureka

 服务端(注册中心)配置

服务端(注册中心)配置需要考虑的问题:

  • 在注册中心维护一个容器列表,保存服务应用的信息
  • 应用下线以后,及时从容器中移除
  • 应用之间访问应该向注册中心缓存一份服务列表,但是如何避免脏读问题
server:port: 8761 # eureka 默认端口spring:application:name: eureka-server # 应用名称(微服务中建议必须定义应用名称)# eureka 配置分为三类:server client 实例
eureka:server:eviction-interval-timer-in-ms: 10000 # 服务端每隔10s做定期删除工作(删除过期服务)renewal-percent-threshold: 0.85 # 续约百分比阈值(超过85%的服务没有续约,那么eureka会保护服务 不糊剔除任何一个)instance: # 实例的配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称:应用名称:端口号hostname: localhost # 主机名称或者服务的ipprefer-ip-address: true # 以 ip 的形式显示具体的服务信息lease-renewal-interval-in-seconds: 5 # 实例的续约时间间隔

客户端配置

# 应用服务 WEB 访问端口
server:port: 8080spring:application:name: eureka-client-aeureka:client:service-url: # 指定注册地址defaultZone: http://localhost:8761/eurekaregister-with-eureka: true # 可以不向 eureka 注册服务fetch-registry: true # 是否缓存一份服务列表到本地registry-fetch-interval-seconds: 10 # 拉取的时间间隔(缓解服务列表脏读的问题)instance:hostname: localhost # 主机或ipinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}prefer-ip-address: true # 显示iplease-renewal-interval-in-seconds: 10 # 续约的时间

构建 eureka-server 集群

        eureka 是一种非主从模式的去中心化的集群模式,多个节点之间互相注册同步自己的服务列表;下面我们除了上面创建好的 eureka-server(8761),再创建两台服务端(注册)节点:

  • 需要在这3个服务端都配置注册地址(添加除自己之外的注册地址,相当于把自己当做一个 client)

创建 eureka-server-b:

server:port: 8762 # eureka 默认端口spring:application:name: eureka-server # 应用名称(微服务中建议必须定义应用名称)# eureka 配置分为三类:server client 实例
eureka:instance: # 实例的配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称:应用名称:端口号hostname: localhost # 主机名称或者服务的ipprefer-ip-address: true # 以 ip 的形式显示具体的服务信息lease-renewal-interval-in-seconds: 5 # 实例的续约时间间隔client:service-url: # 指定注册地址defaultZone: http://localhost:8761/eureka,http://localhost:8763/eureka

创建 eureka-server-c: 

server:port: 8763 # eureka 默认端口spring:application:name: eureka-server # 应用名称(微服务中建议必须定义应用名称)# eureka 配置分为三类:server client 实例
eureka:instance: # 实例的配置instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称:应用名称:端口号hostname: localhost # 主机名称或者服务的ipprefer-ip-address: true # 以 ip 的形式显示具体的服务信息lease-renewal-interval-in-seconds: 5 # 实例的续约时间间隔client:service-url: # 指定注册地址defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

给 eureka-server-b 和 eureka-server--c 添加注解: @EnableEurekaServer

Nacos 和 Eureka 区别:

  • nacos 有命名空间的概念来隔离不同项目中相同的服务名称,但是 eureka 并不能隔离开(可以通过服务名称拼接项目名称的方式来隔离)

修改 application.yml:

server:port: 8080spring:application:name: nacos-client-acloud:nacos:discovery:server-addr: localhost:8848 # 向这个地址注册自己username: nacospassword: nacos

添加 @EnableDiscoveryClient 注解: 

@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现客户端
public class NacosClientAApplication {public static void main(String[] args) {SpringApplication.run(NacosClientAApplication.class, args);}}

注意 SpringBoot 和 SpringCloud Alibaba 版本对应 :版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

配置中心

1、nacos 创建配置:

2、编写 SpringBoot配置文件 bootstrap.yml:

server:port: 8081spring:application:name: nacos-config-acloud:nacos:config:server-addr: localhost:8848username: nacospassword: nacosprefix: nacos-config-a # dataId 默认选择 spring.application.namefile-extension: yml # 配置文件的格式
#        namespace: # 默认 public
#        group: # 默认 DEFAULT_GROUP

这里的 prefix 就相当于是 data id (应用名称),将来就是配置文件的名称

3、编写测试类 

注意:这里写得并不标准,实际开发中的写法看下面的动态配置刷新章节

@RestController
public class TestController {@Value("${hero.name}")private String name;@Value("${hero.age}")private Integer age;@Value("${hero.address}")private String address;@GetMapping("/info")public String getInfo(){return name+":"+age+":"+address;}}

 4、测试

动态配置刷新

实现配置动态刷新很简单,添加注解 @RefreshScope 即可,具体添加的位置:

如果是上面的代码,可以直接添加在 controller 类上,因为下面就是我们的配置属性:

@RestController
@RefreshScope
public class TestController {@Value("${hero.name}")private String name;@Value("${hero.age}")private Integer age;@Value("${hero.address}")private String address;@GetMapping("/info")public String getInfo(){return name+":"+age+":"+address;}}

但是我们一般会添加在配置类Bean上面: 

1、编写配置类

上面我们直接在 controller 中使用 @Value 来读取配置,实际开发中我们一般会单独创建一个配置类。创建 config 包,并创建 Hero 这个配置类:

1.1、写法1(推荐)

这里我们使用 @ConfigurationProperties + @Component 实现配置类的注入

package com.lyh.config;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@RefreshScope
@ConfigurationProperties(prefix = "hero")
public class Hero {private String name;private Integer age;private String address;
}

使用 @ConfigurationProperties 注解需要添加该依赖: 

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

 

 1.2、写法2

使用 @Value + @Component 实现自动注入

package com.lyh.config;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@RefreshScope
public class Hero {@Value("${hero.name}")private String name;@Value("${hero.age}")private Integer age;@Value("${hero.address}")private String address;
}

2、编写 controller

@RestController
public class TestController {@Autowiredprivate Hero hero;@GetMapping("/info")public String getInfo(){return hero.getName()+":"+hero.getAge()+":"+hero.getAddress();}}

 3、测试即可

配置回滚

配置文件的读取方式

nacos 配置中心通过 namespace,dataId 和 group 来唯一确定一条配置。

  • namespace:默认 public
  • dataId:配置文件名称
  • group:组别,默认是 DEFAULT_GROUP

其中,dataId 是最重要的配置,格式为:

${prefix}-${spring.profiles.active}.${file-extension}

注意:在web控制台在写 dataId 时一定要添加文件类型后缀,比如:nacos-config-dev.yml

一个项目中读取多个配置文件(extension-configs)

注意:目前一个项目中要读取多个配置文件只支持在一个命名空间下!

如何读取相同 命名空间下不同组的配置文件:

 编辑配置:

共享配置文件(shared-configs)

        比如多个项目都需要操作同一个数据源(比如 mybatis,redis),那么我们可以通过共享配置文件把数据源统一进行管理。

        现在我们在 nacos 创建一个共享文件:application.yml 。

写法1(不能修改 group,只能在默认组):

server:port: 8082
spring:application:name: nacos-config-testcloud:nacos:config:namespace: 19519eb4-c512-4907-9127-9bda8a575125group: A_GROUPusername: nacospassword: nacosserver-addr: localhost:8848file-extension: ymlprefix: user-centershared-configs:- application-dev.yml # 这种写法只能在 DEFAULT_GROUPprofiles:active: dev

写法2(可以修改组)

server:port: 8082
spring:application:name: nacos-config-testcloud:nacos:config:namespace: 19519eb4-c512-4907-9127-9bda8a575125group: A_GROUPusername: nacospassword: nacosserver-addr: localhost:8848file-extension: ymlprefix: user-centershared-configs:- dataId: application-dev.ymlgroup: A_GROUPrefresh: true

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

目录 1 什么是枚举 2 定义枚举类型 2.1 语法格式 2.2 枚举元素的特点 2.3 案例演示 3 枚举变量 3.1 什么是枚举变量 3.2 定义枚举变量的多种方式 3.3 案例演示 1&#xff1a;标准版枚举类型 3.4 案例演示 2&#xff1a;简化版枚举类型 3.5 案例演示 3&#xff1a;匿…

RTR_Chapter_6 下

程序化纹理 上文所提到的方法&#xff0c;都是给定一个纹理空间中的坐标位置&#xff0c;然后在图像中进行查找&#xff0c;从而获得纹理值。还有一种方法是对函数进行求值&#xff0c;然后作为对应位置上的纹理值&#xff0c;这就是程序化纹理&#xff08;procedural texture&…

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…

使用TM1618控制LED了解P-MOS和N-MOS的开漏输出的不同

数据手册上的截取内容 手册中推荐的共阴/阳极电路 可以发现GRID总接LED的负极&#xff0c;SEG引脚接的是LED 正极 分析输出的MOS管类型可以很好的知道原因 图片来源 通过都是开漏输出可以看出&#xff0c;引脚引出的内部电路是不同的。P-mos引出的是漏极&#xff0c;导通时…

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库&#xff0c;专为简化在分布式环境中的Java开发而设计。通过Redisson&#xff0c;开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象&#xff0c;并处理各种分布式场景的挑战。 Redisson的设计灵感来…

软考鸭微信小程序:助力软考备考的便捷工具

一、软考鸭微信小程序的功能 “软考鸭”微信小程序是一款针对软考考生的备考辅助工具&#xff0c;提供了丰富的备考资源和功能&#xff0c;帮助考生提高备考效率&#xff0c;顺利通过考试。其主要功能包括&#xff1a; 历年试题库&#xff1a;小程序内集成了历年软考试题&…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下&#xff0c;国内旅游更是呈现出蓬勃的发展态势。中国&#xff0c;这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地&#xff0c;为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力&#xff0c;深入剖…

Java.数据结构.HashMap

目录 1基本概念 2数据结构 3常用操作 3.1 put(K key, V value)&#xff1a;插入键值对。 3.2 get(Object key)&#xff1a;根据键获取值。 3.3 remove(Object key)&#xff1a;移除键值对。 3.4 containsKey(Object key)&#xff1a;判断Map中是否包含指定的键。 3.5 c…

Android Camera2 与 Camera API技术探究和RAW数据采集

Android Camera2 Android Camera2 是 Android 系统中用于相机操作的一套高级应用程序接口&#xff08;API&#xff09;&#xff0c;它取代了之前的 Camera API。以下是关于 Android Camera2 的一些主要信息&#xff1a; 主要特点&#xff1a; 强大的控制能力&#xff1a;提供…

神秘的二叉树

一.什么是树 都说艺术来源于生活&#xff0c;技术同样也是来源于生活。什么是树&#xff0c;它是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

VUE2常见问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 row-click 事件与行内点击事件冲突&#xff0c;点击事件不生效&#xff08;表格行点击事件和行内元素点击事件冲突&#xff09;需要阻止事件冒泡 问题描述 1.点击列的编辑按钮&#xff0c;会触发按钮本身事件&#xff0c;同时会触发行点击事件 2.点…

Kotlin 处理字符串和正则表达式(二十一)

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…

R包的安装、加载以及如何查看帮助文档

0x01 如何安装R包 一、通过R 内置函数安装&#xff08;常用&#xff09; 1.安装CRAN的R包 install.packages()是一个用于安装 R 包的重要函数。 语法&#xff1a;install.packages(pkgs, repos getOption("repos"),...) 其中&#xff1a; pkgs&#xff1a;要安…

问题-python-运行报错-SyntaxError: Non-UTF-8 code starting with ‘\xd5‘ in file 汉字编码问题

​ 编码: 把字符转换成字节序列的过程。因为计算机只能处 理二进制数据&#xff0c;所以不能直接处理文本&#xff0c;需要先把文本转换为二进制数据。 解码: 把二进制数据转换成字符的过程。把接收到的数据转换成程序中使用的编码方式。 ​ 这个报错原因就是编码和解码没达成…

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…

[已解决] Install PyTorch 报错 —— OpenOccupancy 配环境

目录 关于 常见的初始化报错 环境推荐 torch, torchvision & torchaudio cudatoolkit 本地pip安装方法 关于 OpenOccupancy: 语义占用感知对于自动驾驶至关重要&#xff0c;因为自动驾驶汽车需要对3D城市结构进行细粒度感知。然而&#xff0c;现有的相关基准在城市场…

TriLite完成A轮扩展融资:加速AR微型投影仪技术创新与市场拓展

近日,全球领先的AR微型投影仪开发商TriLite宣布成功完成A轮扩展融资,将A轮融资总额提升至超过2000万欧元。这一轮融资不仅彰显了资本市场对TriLite技术实力和市场潜力的高度认可,更为其后续在AR微型投影仪领域的技术研发、产品迭代以及市场拓展提供了坚实的资金保障。以下是…

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗&#xff1f; 这个罪恶的源头就是 Google&#xff0c;说是为了选择高素质的计算机编程水平的人才&#xff0c;然后把面试就变成了考试&#xff0c;最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…

【AI知识点】置信区间(Confidence Interval)

置信区间&#xff08;Confidence Interval, CI&#xff09; 是统计学中用于估计总体参数的范围。它给出了一个区间&#xff0c;并且这个区间包含总体参数的概率等于某个指定的置信水平&#xff08;通常是 90%、95% 或 99%&#xff09;。与点估计不同&#xff0c;置信区间通过区…