7.31日学习打卡---Spring Cloud Alibaba(一)

news2024/11/15 23:44:16

7.31日学习打卡

目录:

  • 7.31日学习打卡
  • 一.架构的演变
    • 单体应用阶段
    • 垂直应用阶段
    • 分布式系统阶段
    • 微服务阶段
  • 二. Spring Cloud Alibaba
    • 什么是Spring Cloud Alibaba
    • 分布式配置中心_搭建微服务项目环境
    • 为什么需要服务治理
    • 分布式配置中心_Nacos
      • 四大功能
      • Windows 搭建部署Nacos
      • Linux 搭建部署Nacos
    • 分布式配置中心_将支付微服务接入Nacos注册中心
    • 分布式配置中心_将订单微服务接入Nacos注册中心
    • 分布式配置中心_用CP模式和AP模式来保持注册中心的数据一致性
    • 为什么需要分布式配置中心
    • 分布式配置中心_了解主流的配置中心
    • 分布式配置中心_Namespace命名空间
    • 分布式配置中心_DataID配置
    • 分布式配置中心_Group分组方案
    • Namespace实施方案
    • 分布式配置中心_Nacos配置动态刷新
    • 分布式配置中心_Nacos集群架构介绍
    • 分布式配置中心_Nacos的数据持久化
    • 分布式配置中心_Nacos集群配置

在这里插入图片描述

一.架构的演变

单体应用阶段

在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬件成本较高。因此,一般的企业会将所有的功能都集成在一起开发一个单体应用,然后将该单体应用部署到一台服务器上即可满足业务需求。
**加粗样式**
单体应用的特点:

  • 能够接纳的请求数量时有限的,因为服务器的内存、CPU配置是有限的。
  • 展现层、控制层、持久层全都在一个应用里面,调用方便、快速。单个请求的响应结果超快。
  • 开发简单、上手快、三五个人团队好管好用。

生活中的单体应用

小夫妻俩刚结婚,手里资金有限,就想着开一个路边烧烤摊。丈夫负责烤串做菜、妻子负责服务收银及上菜。这是一个典型的路边烧烤摊的经营模式。

垂直应用阶段

随着小夫妻俩经营有方、待客有道,开始有人愿意为了吃他们做的烧烤排队了。夫妻俩一想,我们这俩人也干不过来啊,怎么办?招人吧、扩大规模吧。

在这里插入图片描述

问题
在处理并发请求的能力和容量上增强了,但是在单个请求的处理速度上下降了。

分布式系统阶段

为了解决上一阶段遇到的问题:单个请求的处理速度下降。也就是饭店针对单个订单做菜响应速度下降了,但是由于饭店的菜确实好吃、菜品精良,客流量又持续的增高。该店又再次面临扩容的问题。

  • 为了解决客流量持续增高,夫妻又招聘了4位厨师
  • 为了解决单个订单处理速度下降的问题,将厨师分为两组,一组专门做烧烤,一组专门做饭菜。专业的人做专业的事情,注意力越集中,办事越熟练、效率越高。
    在这里插入图片描述

微服务阶段

饭店的规模越来越大了、岗位分工也越来越细了。真的成了超级大饭店了,怎么管?

什么是微服务:

将系统的业务功能划分为极小的独立微服务,每个微服务只关注于完成某个小的任务。系统中的单个微服务可以被独立部署和扩展,且各个微服务之间是高内聚、松耦合的。微服务之间采用轻量化通信机制暴露接来实现通信。

在这里插入图片描述
解释:

  • 服务网关:前台。所有的顾客进来,由前台统一接待。比如:Spring Cloud Gateway。
  • 熔断机制:菜品限量,法式菜品、意大利菜品、日本料理。什么时间可以吃得到、可提供多少人份?这些服务都是有限制的。
  • 工作效率监督:工作流程中每个岗位做了什么工作、用了多长时间。哪个环节出现问题、哪个岗位需要调整。比如: Sleuth、日志监控ELK等。
  • 配置中心:菜单,川菜,东北菜,杭帮菜,烩菜。
  • 服务集群:厨师微服务集群包含,川菜厨师微服务,杭帮菜厨师微服务等。
  • 高可用注册中心:大堂经理,负责那些人上班了,他在哪里干的什么工作。

二. Spring Cloud Alibaba

在这里插入图片描述

什么是Spring Cloud Alibaba

Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。官网https://sca.aliyun.com/zh-cn/

在这里插入图片描述
Spring Cloud Alibaba 定位

在这里插入图片描述

分布式配置中心_搭建微服务项目环境

新建微服务项目
在这里插入图片描述
设置项目为父工程
在这里插入图片描述

设置统一版本号

 <properties>
  <dubbo.version>3.2.4</dubbo.version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <java.version>17</java.version>
  <spring-boot.version>3.0.2</spring-boot.version>
  <spring-cloud.version>2022.0.0</spring-cloud.version>
  <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
 </properties>




 <!-- 依赖声明 -->
 <dependencyManagement>
  <dependencies>
   <!-- SpringCloud 微服务 -->
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>


   <!-- SpringCloud Alibaba 微服务 -->
   <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>


   <!-- SpringBoot 依赖配置 -->
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring-boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>


   <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
   </dependency>


   <!-- Dubbo -->
   <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-bom</artifactId>
    <version>${dubbo.version}</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
 </dependencyManagement>


 <dependencies>
  <!-- bootstrap 启动器 -->
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.28</version>
  </dependency>
 </dependencies>


 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>${java.version}</source>
     <target>${java.version}</target>
     <encoding>${project.build.sourceEncoding}</encoding>
    </configuration>
   </plugin>
  </plugins>
 </build>


 <repositories>
  <repository>
   <id>public</id>
   <name>aliyun nexus</name>
   <url>https://maven.aliyun.com/repository/public</url>
   <releases>
    <enabled>true</enabled>
   </releases>
  </repository>
 </repositories>


 <pluginRepositories>
  <pluginRepository>
   <id>public</id>
   <name>aliyun nexus</name>
   <url>https://maven.aliyun.com/repository/public</url>
   <releases>
    <enabled>true</enabled>
   </releases>
   <snapshots>
    <enabled>false</enabled>
   </snapshots>
  </pluginRepository>
 </pluginRepositories>

修改字符编码

在这里插入图片描述
设置Aliyun阿里云以及Spring本地仓库镜像

<repositories>
  <repository>
      <id>alimaven</id>
      <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
 </repositories>

项目工程开启DashBoard

在项目文件目录找到.idea目录并在workspace.xml中找到RunDashboard,配置如下;然后需要重新关闭项目重启项目配置生效。

<component name="RunDashboard">
 <option name="ruleStates">
  <list>
   <RuleState>
    <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
   </RuleState>
   <RuleState>
    <option name="name" value="StatusDashboardGroupingRule" />
   </RuleState>
  </list>
 </option>
 <!-- 新增的配置 -->
 <option name="configurationTypes">
  <set>
   <option value="SpringBootApplicationConfigurationType" />
  </set>
 </option>
 </component>

创建订单生产者模块

新建子工程jjy-order,把所有业务模块放到modules模块下统一管理。
在这里插入图片描述

创建支付生产者模块

新建子工程jjy-payment,把所有业务模块放到modules模块下统一管理。

在这里插入图片描述

为什么需要服务治理

在这里插入图片描述
在没有进行服务治理前,服务之间的通信是通过服务间直接相互调用来实现的。

在这里插入图片描述
微服务系统中服务众多,这样会导致服务间的相互调用非常不便,因为要记住提供服务的IP地址、名称、端口号等。这时就需要中间代理,通过中间代理来完成调用。

服务治理的解决方案

服务治理责任:

  • 你是谁:服务注册 - 服务提供方自报家门
  • 你来自哪里:服务发现 - 服务消费者拉取注册数据
  • 你好吗:心跳检测,服务续约和服务剔除 一套由服务提供方和注册中心配合完成的去伪存真的过程
  • 当你死的时候:服务下线 - 服务提供方发起主动下线

服务治理技术选型
在这里插入图片描述

分布式配置中心_Nacos

在这里插入图片描述
Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开发者提供一款便捷、简单上手的开源框架。

Nacos惊人的地方
在这里插入图片描述

注意
从上图不难看出阿里巴巴的野心,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka服务配置Config服务总线Bus

四大功能

服务发现和服务健康监测

Nacos 使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

动态配置服务

动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。

动态 DNS 服务

Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便查阅及发现。

服务及其元数据管理

Nacos能让您从微服务平台建设的视觉管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

Windows 搭建部署Nacos

Nacos安装和启动

  • nacos对应GitHub下载链接

  • 进入链接后,选择所需版本并点击对应格式下载(windows 选择 zip文件就好)

在这里插入图片描述
下载完成后解压可以看到如下目录
在这里插入图片描述

  • 我们可以通过修改config目录下的 application.properties 文件修改nacos配置。比如端口号,其默认值为8848,是一个非常成功人士的端口,一般情况下无需修改。

  • 完成上述操作后我们可以试着启动nacos,首先进入bin目录下,路径栏输入cmd 进入命令行窗口,输入 startup.cmd -m standalone 即可启动nacos。成功界面如下

.\startup.cmd -m standalone

在这里插入图片描述
然后我们图片中Console处的网址即可进入nacos图形界面工具

在这里插入图片描述

Linux 搭建部署Nacos

预备环境准备
Nacos 依赖 Java环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用。

## 1、下载安装JDK
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
## 2、解压缩
tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local
## 3、修改/etc/profile配置文件
sudo vim /etc/profile
## 4、写入配置
export JAVA_HOME=/usr/local/jdk-17.0.5
export PATH=$PATH:${JAVA_PATH}/bin
# 5、刷新一下
source /etc/profile
  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+;
  • Maven 3.2.x+;

下载源码或者安装包

通过源码和发行包两种方式来获取 Nacos。https://github.com/alibaba/nacos/releases

下载后解压

tar -zxvf nacos-server-2.2.3.tar.gz -C /usr/local

启动服务器

# 1、Linux/Unix/Mac
#启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone


# 2、如果您使用的是ubuntu系统
bash startup.sh -m standalone


# 3、Windows
#启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

注意
standalone代表着单机模式运行。

分布式配置中心_将支付微服务接入Nacos注册中心

在这里插入图片描述
订单模块引入依赖

<dependencies>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


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


</dependencies>

编写配置文件
创建application.yml配置文件。

spring:
  application:
   name: paymentservice
  cloud:
   nacos:
    discovery:
    # 配置 Nacos注册中心地址
     server-addr: 192.168.47.100:8848
server:
  port: 8003

编写主启动类

/**
 * 支付微服务主启动类
 */
@Slf4j
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
@SpringBootApplication
public class PaymentSpringApplication {
  public static void main( String[] args )
   {
    SpringApplication.run(PaymentSpringApplication.class,args);
    log.info("************** 支付服务启动成功 ************");
   }
}

控制台查看支付微服务

在浏览器输入http://自己的ip/nacos查看支付微服务。
在这里插入图片描述

分布式配置中心_将订单微服务接入Nacos注册中心

引入依赖

<dependencies>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

</dependencies>

编写配置文件
在resources文件下创建application.yml配置文件。

spring:
  application:
   name: orderservice
  cloud:
   nacos:
    discovery:
    # 配置 Nacos注册中心地址
     server-addr: 192.168.47.100:8848

server:
  port: 81

编写主启动类

/**
 * 订单微服务主启动类
 */
@Slf4j
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
@SpringBootApplication
public class OrderSpringApplication
{
  public static void main( String[] args )
   {
    SpringApplication.run(OrderSpringApplication.class,args);
    log.info("************** 订单服务启动成功 ************");
   }
}

浏览器进行测试
在浏览器输入http://自己的ip/nacos查看支付微服务。

分布式配置中心_用CP模式和AP模式来保持注册中心的数据一致性

在这里插入图片描述
CAP理论

著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性P在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。

服务注册中心对比

NacosEurekaConsulCoreDNSZookeeper
一致性协议CP+APAPCP/CP
健康检查TCP/HTTP/MySQL/Client BeatClient BeatTCP/HTTP/gRPC/Cmd/Client Beat
负载均衡权重/DSL/metadata/CMDBRibbonFabioRR/
雪崩保护支持支持不支持不支持不支持
自动注销实例支持支持不支持不支持支持
访问协议HTTP/DNS/UDPHTTPHTTP/DNSDNSTCP
监听支持支持支持支持不支持支持
多数据中心支持支持支持不支持不支持
跨注册中心支持不支持支持不支持不支持
SpringCloud集成支持支持支持不支持不支持
Dubbo集成支持不支持不支持不支持支持
K8s集成支持不支持支持支持不支持

Nacos的AP模式和CP模式切换

Nacos是可以在AP模式和CP模式之间进行切换的,默认为AP。
(1)切换为CP模式。

curl -X PUT "http://localhost:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP"

在这里插入图片描述

(2)切换为AP模式。

curl -X PUT "http://localhost:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=AP"

选用何种模式
在这里插入图片描述

重点:
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和 Dubbo服务,都适用于AP模式。AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

实际开发选择
追求CP: 用户请求支付,等待支付订单生成以及库存系统数据更新,再给用户返回结果 追求强一致性 缺点:用户体验差。

追求AP: 用户请求支付,立即给用户响应结果,异步处理库存系统 放弃强一致性,采用最终一致性。

为什么需要分布式配置中心

我们现在有一个项目,使用SpringBoot进行开发的,配置文件的话我们知道是一个叫做application.yml的文件。
在这里插入图片描述

#业务参数相关配置
spring:
 # 数据源配置
  datasource:
   type: com.alibaba.druid.pool.DruidDataSource
   driverClassName: com.mysql.cj.jdbc.Driver
   druid:
   # 主库数据源
    master:
     url: jdbc:mysql://192.168.47.1003306/test
     username: root
     password: 123456

需求一
由于业务的变动,用户在以前进行注册的时候默认的数据库在192.168.47.100,但是该节点数据库出现问题,需要把IP这个改成192.168.47.101。因为,业务的流量还是比较大的,所以,没有办法在白天流量高峰期修改配置文件,进行重启!

问题:
就辛苦开发的小哥,他们需要等到半夜里凌晨三四点的时候,没有流量的时候,小心翼翼的去修改application.properties配置文件,必将系统进行重启。开发小哥是在忍受不了这种变更了,修改一个配置就需要如此周折的去完成这件事情!忍无可忍。

需求二

我们在进行业务开发的时候,一般会有多个环境,至少应该有三个:开发、测试、线上。那这三个环境之间的配置文件肯定是有不同的,比如说他们之间的数据库是肯定不同的!

在这里插入图片描述
分别需要设置的命令如下:

java -jar -Dspring.profiles.active=dev nssas.jar
和
java -jar -Dspring.profiles.active=test nssas.jar
和
java -jar -Dspring.profiles.active=prod nssas.jar

运维小哥的工作量直接翻了一倍多,想想还有十几个项目需要这样进行修改,运维小哥悄悄的拿起了抽屉里准备了很久的xxx走向了开发小哥。

主要缺点:

  • 不支持配置文件的动态更新:在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
  • 不支持配置集中式管理:在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
  • 不支持多环境部署:如果通过底层框架来维护不同环境的信息,则成本也是非常高的。

注意:
把各个服务的某些配置信息统一交给第三方中间件来维护,分布式配置管理上的数据变变更,需要实时地推送到相对应的应用服务节点上。

在这里插入图片描述

分布式配置中心_了解主流的配置中心

主流的分布式配置中心有以下三种,其中,Nacos是Alibaba开源的分布式配置中心。

Nacos

这是Sping Cloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

在这里插入图片描述
应用和配置中心间的数据同步通常如下三种模式:

Pull模式:让应用开后长轮询,即定时地从配置中心拉取最新的配置信息,并更新到应用的内存中。
**Push模式:**在配置中心配置数据变更之后,主动推送配置数据到指定的应用,应用更新到本地内存中。
**混合模式:**应用和配置中心通过“事件机制+监听器”模式保持长连接。如果应用监听的配置信息发生了变化,则配置中心发布对应类型的事件。应用只有在监听到该事件之后,才会处理对应的配置信息,并更新到应用本地。

分布式配置中心对比

在这里插入图片描述

分布式配置中心_Namespace命名空间

现如今,在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境。

在这里插入图片描述
我们来说算一算,假设某系统有10个微服务,那么至少有10个配置文件吧,三个环境(dev/test/prod),那就有30个配置文件需要进行管理。

概念
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认namespace=public的保留空间,不支持删除;默认情况下。

在这里插入图片描述
场景
Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod等。
在这里插入图片描述

注意:
命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

新建dev/test的Namespac

在这里插入图片描述
查看命名空间

在这里插入图片描述

分布式配置中心_DataID配置

概念

Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。

注意:
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。

dataId的拼接格式
在这里插入图片描述

解释:

  • prefix:默认为 spring.application.name 的值。
  • spring.profiles.active:即为当前环境对应的 profile。
  • file-extension:文件后缀

当activeprofile为空时。
在这里插入图片描述
新建dev配置DataID

在这里插入图片描述
编写配置
在这里插入图片描述

分布式配置中心_Group分组方案

概念
当您在 Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。

image-20220314113012353

通过Group实现环境区分
在这里插入图片描述
在Nacos图形界面控制台上传新建配置文件DataID
在这里插入图片描述

Namespace实施方案

Nacos给出了两种Namespace的实践方案

  • 面向一个租户
  • 面向多个租户

面向一个租户
从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。

例如,你可能有dev,test和prod三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。
在这里插入图片描述
面向多个租户

当多个项目同时使用该Nacos集群时,还可以通过Group进行Namespace内的细化分组。这里以Namespace:dev为例,在Namespace中通过不同Group进行同一环境中不同项目的再分类。
在这里插入图片描述

注意:
通过上面的理论分析,可以看出方案二有很好的扩展性

新建配置

新建命名空间dev,在配置管理->配置列表里面切换dev环境,创建payment-dev.yaml文件。

在这里插入图片描述
创建工程jjy-payment-config

POM引入依赖

  <dependencies>


    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


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


  </dependencies>

编写主启动类

@Slf4j
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentConfig
{
  public static void main(String[] args)
   {
    SpringApplication.run(PaymentConfig3344.class,args);
    log.info("******************** 支付服务启动成功 ***************");
   }
}

创建配置文件

创建配置文件名为bootstrap.yml,注意是bootstrap.yml,而不是application。

原因:
Nacos同SpringCloud-Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。

  • bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
  • application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
  • bootstrap.yml 先于 application.yml 加载
spring:
  profiles:
  #多环境配置
   active: dev
  application:
  #项目名字
   name: payment
  cloud:
   nacos:
    config:
    #服务器地址
     server-addr: 192.168.47.100:8848
    #默认为Public命名空间,可以省略不写 #对应建立的命名空间的UUID
     namespace: 8e6ad638-30c9-490c-8b02-65be434ca3a2
    #指定文件后缀
     file-extension: yaml
    #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
     prefix: ${spring.application.name}
    #指定配置群组 --如果是Public命名空间 则可以省略群组配置
     group: DEFAULT_GROUP

注意:

  • spring.application.name:可以看到必须可少的配置项
  • spring.cloud.nacos.discovery.server-addr:指定注册中心的地址,如果你不需要注册该服务,也可以去掉该项,并删除discovery依赖
  • spring.cloud.nacos.config.server-addr:指定配置中心的地址
  • file-extension:指定配置中心中配置文件的格式

上面的配置是为了保证服务的正常注册和配置获取,以及配置DataID的正确性

@RestController
public class HelloController {


  @Value("${hello.message}")
  private String hello;

  @GetMapping("/hello")
  public String hello(){
    return hello;
   }


}

分布式配置中心_Nacos配置动态刷新

在这里插入图片描述
配置动态刷新
配置的动态刷新,仅需要使用@RefreshScope注解即可。

注解方式

@RestController
/* 只需要在需要动态读取配置的类上添加此注解就可以 */
@RefreshScope 
public class HelloController {




  @Value("${hello.message}")
  private String hello;


  @GetMapping("/hello")
  public String hello(){
    return hello;
   }

}

分布式配置中心_Nacos集群架构介绍

在这里插入图片描述

为什么需要搭建Nacos集群

在实际开发过程中,如果使用Nacos 的话,为了确保高可用,我们一般都会对其进行集群的部署。 Nacos 规定集群中 Nacos 节点的数量需要大于等于 3 个 ;同时,单机模式下 Nacos 的数据默认保存在其内嵌数据库中 deby ,不方便观察数据存储的基本情况。而且如果集群中启动多个默认配置下的Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题, Nacos采用了集中式存储的方式来支持集群化部署,目前只支持 MySQL 的存储。

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

集群模式

在这里插入图片描述

分布式配置中心_Nacos的数据持久化

初始化数据库
Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有进入\nacos\conf目录,初始化文件:mysql-schema.sql此处我创建一个名为 mynacos 的数据库,然后执行初始化脚本,成功后会生成 11 张表;

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f07dd7428e3f4e17be5d82c88229013c.png
修改配置文件
这里是需要修改Nacos-server的配置文件Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:

spring.datasource.platform=mysql


db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

启动Nacos-server和Nacos-config
先启动Nacos-server,启动成功后进入Nacos控制台,此时的Nacos控制台中焕然一新,之前的数据都不见了。

注意:
因为加入了新的数据源,Nacos从mysql中读取所有的配置文件,而我们刚刚初始化的数据库是干干净净的,自然不会有什么数据和信息显示。

在公共空间(public)中新建一个配置文件DataID: nacos-config.yml, 配置内容如下:

server: 
   port: 9989
nacos:
   config: 配置文件已持久化到数据库中...

再启动Nacos(四)中的demo项目。服务启动成功后,观察Nacos控制台如下
在这里插入图片描述
验证是否持久化到数据库中
在这里插入图片描述

分布式配置中心_Nacos集群配置

在这里插入图片描述
准备工作

将Nacos复制三份前提一定是要关闭Nacos。

集群启动
在本地通过3个端口模拟3台机器,端口分别是:8848,8858,8868。

#copy3份解压后的nacos,修改各自的application.properties中的端口号,分别为:8848,8858,8868
server.port=8848
server.port=8858
server.port=8868

各自的conf目录下放cluster.conf文件,文件内容为:

192.168.47.100:8848
192.168.47.100:8858
192.168.47.100:8868

启动Nacos服务

./startup.sh 

注意:
如果内存不够可以修改内存参数。

  • Xms 是指设定程序启动时占用内存大小
  • Xmx 是指设定程序运行期间最大可占用的内存大小
  • Xmn 新生代的大小

使用Nginx作负载均衡访问集群的Nacos
环境安装

yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel

安装Nginx

./configure
make && make install

配置nginx.conf文件

#定义upstream名字,下面会引用
upstream nacos {  
    #指定后端服务器地址
    server 192.168.47.100:8848;    
    server 192.168.47.100:8858; 
    server 192.168.47.100:8868;   
}
 
server {
 listen 80;
 server_name localhost;
 location / {
   proxy_pass http://nacos;    #引用upstream
  }
}

重启Nginx

docker restart nginx

通过访问Nginx就可以实现Nacos访问的负载均衡
请求http://localhost/nacos
在这里插入图片描述

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

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

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

相关文章

基于SSM框架的学生考勤管理系统设计与实现源码+lw+部署文档+讲解等)

文章目录&#xff1a; 目录 详细视频演示 系统实现界面 .2管理员功能模块实现 5.3学生功能模块实现 技术栈查看 2.1 人脸识别技术的概念 2.2 Java介绍 2.3 MySql数据库 2.4 Tomcat简介 2.5 B/S架构 2.6 SSM框架 系统整体设计 系统测试的目的 6.2软件测试过程 6.…

C语言典型例题14

//《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.2 中国在2020年11月1日进行第7次全国人口普查&#xff0c;全国人口为1411778724人&#xff0c;假设年增长率为0.5%&#xff0c;计算到2050年有多少人口&#xff1f; //《C程序设计教程&#xff08;第四版…

[玄机]流量特征分析-蚁剑流量分析

题目网址【玄机】&#xff1a;https://xj.edisec.net/ AntSword&#xff08;蚁剑&#xff09;是一款开源的网络安全工具&#xff0c;常用于网络渗透测试和攻击。它可以远程连接并控制被攻击计算机&#xff0c;执行命令、上传下载文件等操作。 蚁剑与网站进行数据交互的过程中&a…

iOS开发-图片上涂鸦绘制撤销功能

iOS开发-图片上涂鸦绘制撤销功能 当我们需要重新在图片上进行绘制涂鸦生成新的图&#xff0c;这里使用到了Graphics中的API功能。 Graphics Framework是一套基于C的API框架&#xff0c;使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。 微信搜索小游戏…

wps在pc端在线预览,而不是下载

如果有有java后端代码如下 SneakyThrowsApiOperation("访问文件")GetMapping("/download/{name}")public void getImage(HttpServletResponse response, PathVariable("name") String name) {String imagePath uploadFilePath File.separator …

文件上传漏洞--之upload-labs靶场第 11-15关(后三关需要制作图片马)持续更新ing...

第11关 第一步&#xff1a;查看源码 这是一个白名单&#xff0c;里面限制了只可以提供它所规定文件jpg&#xff0c;png,gif。 这段 PHP 代码主要实现了文件上传的功能&#xff0c;并进行了一些条件判断和处理&#xff1a; 首先&#xff0c;定义了两个变量 $is_upload 并初始…

GitHub Pages上用vue搭建个人网站简记

新建仓库 将仓库取名为:<你的用户名>.github.io 就像这样 GitHub会帮你自动部署在 https://jerryqjr.github.io/ 上 npm run build后把disk传入新的分支 git subtree push --prefix dist origin gh-pages将子目录 dist 的内容推送到远程分支 gh-pages 随后在 Settin…

综合点评!史上最强开源大模型Llama 3.1

在人工智能领域&#xff0c;开源模型一直是推动技术进步和创新的重要力量。 北美时间7月23日&#xff0c;Meta公司&#xff08;原Facebook&#xff09;宣布了一项重大突破&#xff1a;开源模型Llama 3.1的正式发布。这一举措预示着AI技术的又一次飞跃&#xff0c;Llama 3.1有望…

java~反射

反射 使用的前提条件&#xff1a;必须先得到代表的字节码的Class&#xff0c;Class类用于表示.class文件&#xff08;字节码&#xff09; 原理图 加载完类后&#xff0c;在堆中就产生了一个Class类型的对象&#xff08;一个类只有一个Class对象&#xff09;&#xff0c;这个对…

IOday4

一、思维导图 二、练习 1、使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半内容&#xff0c;子进程拷贝后一半内容&#xff0c;子进程结束后退出&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {//判断终…

分享:Vue3中如何使用echarts工具开发可视化图表

官方链接 点此进入 导入 import * as echarts from echarts 页面 <div id vdrBarChart style"height: 300px;width: 500px;"></div> 调用 //DOM 更新完成后&#xff0c;延时100ms执行setBarChart方法this.$nextTick(() > {setTimeout(() >…

电路设计-基础2-电阻电容

电路设计-基础2-电阻电容 分立元件常见的分立元件及其功能分立元件的特点 电阻**注意**电阻种类1. 直插电阻&#xff08;色环电阻&#xff09;2. 贴片电阻&#xff08;SMD电阻&#xff09;3. 电位器&#xff08;可变电阻器,滑动变阻器&#xff09;4. 热敏电阻&#xff08;NTC/P…

如何解决部分设备分辨率不适配

1&#xff09;如何解决部分设备分辨率不适配 2&#xff09;Unity中如何实现草的LOD 3&#xff09;使用了Play Asset Delivery提交版本被Google报错 4&#xff09;如何计算弧线弹道的落地位置 这是第396篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;…

运筹说 第120期 | 确定型存储模型

上一期我们一起学习了存储问题及其基本概念&#xff0c;本期小编将带大家学习确定型存储模型的相关内容。 下面我们一起来学习确定型存储模型的五个基础模型吧&#xff01; 模型一&#xff1a;不允许缺货&#xff0c;补充时间极短 为了便于描述和分析&#xff0c;对模型作如下…

基于视觉的语义匹配见多了,那基于雷达的呢?

论文题目&#xff1a; LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection 论文作者&#xff1a; Yansong Gong, Xinglian Zhang, Jingyi Feng, Xiao He and Dan Zhang 作者单位&#xff1a;北京驭势科技有限公司 导读&#xff…

【C++哈希应用】模拟实现STL中的unordered_map和unordered_set

目录 &#x1f680; 前言一&#xff1a; &#x1f525; 哈希表的改造1.1 模板参数列表的改造1.2 增加迭代器操作 二&#xff1a; &#x1f525; 封装unordered_map和unordered_set 2.1 unordered_map的模拟实现&#xff1a;2.1.1 unordered_map的测试 2.2 unordered_set的模拟实…

图像自定义画框box标注,坐标像素点获取;通过坐标点画框

1、jupyter-bbox-widget画框&#xff0c;这只能jupyter环境插件使用 pip install jupyter_bbox_widget ##安装 ##注册 jupyter nbextension enable --py --sys-prefix jupyter_bbox_widget使用 from jupyter_bbox_widget import BBoxWidget widget BBoxWidget(imagefruit.jp…

【深度学习】kaggle使用

https://blog.csdn.net/2301_78630677/article/details/133834096 https://blog.csdn.net/xiaojia1001/article/details/139467176 https://www.kaggle.com/ 使用要挂代理&#xff0c;要不然可能无法注册 绑定手机号之后才能使用GPU 每周30h免费GPU使用时长 上传数据集 Ad…

【文件解析漏洞】

使用windows2003sever服务器 第一个&#xff1a;目录解析 1、打开网站目录&#xff0c;右键打开资源管理器 新建一个1.asp文件 在1.asp目录下新建一个2.txt&#xff0c;输入asp的语句 2、使用本机访问windows2003的IP地址 访问http://192.168.189.155/1.asp/2.txt即可 第…

Minio多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能 中文地址&#xff1a;MinIO | 用于AI的S3 …