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

ops/2024/10/9 2:11:49/

Eureka

1、创建服务端

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

java">@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
java">@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

 服务端(注册中心)配置

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

  • 在注册中心维护一个容器列表,保存服务应用的信息
  • 应用下线以后,及时从容器中移除
  • 应用之间访问应该向注册中心缓存一份服务列表,但是如何避免脏读问题
java">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 # 实例的续约时间间隔

客户端配置

java"># 应用服务 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 注解: 

java">@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、编写测试类 

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

java">@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 类上,因为下面就是我们的配置属性:

java">@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 实现配置类的注入

java">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 实现自动注入

java">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

java">@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.ppmy.cn/ops/122925.html

相关文章

力扣206.反转链表

题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; …

map和set的使用

引言 序列式容器和关联式容器 序列式容器&#xff1a;逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧密的关联关系&#xff0c;例如&#xff1a;string、vector、list、deque、array. 关联式容器&#xff1a;关联式容器也是用来存储数据的&#x…

如何让70B参数的大型语言模型在资源有限的边缘设备上高效运行?

你有没有想过,像我们平时使用的智能手机、家里的智能音箱这样的小设备,也能运行那些参数量高达数十亿的大型语言模型(LLM)呢?这听起来像是天方夜谭,毕竟这些模型动辄需要巨大的算力和存储资源,但实际上,随着技术的发展,这个梦想正在变成现实。那么,问题来了,怎么在资…

Streamlit:用Python快速构建交互式Web应用

在传统的Web开发中&#xff0c;开发者常常需要编写大量的前端和后端代码&#xff0c;才能实现一个简单的交互式Web应用。Streamlit 通过简化这一过程&#xff0c;使得你只需要用Python编写代码&#xff0c;就能快速创建具有丰富交互功能的Web应用。本文将介绍如何使用Streamlit…

Echarts实现订单数据统计,前端+后端 代码

以下是静态统计图可以直接看到统计图&#xff0c;复制粘贴即可看到效果&#xff0c;但是数据是死的。下面我会介绍一种动态的方法 &#xff0c;后端动态返回&#xff0c;基于订单页面的数据&#xff0c;来渲染统计图。 Vue 安装 Echarts npm i echarts -S 静态 &#xff1a; …

【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…

Thinkphp/Laravel基于vue.js的社区健康服务管理系统Vscode毕业设计成品源码_0i0k4

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…