SpringCloud Alibaba

Spring Cloud Alibaba 致力于提供微服务开发 的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里 微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

SpringCloud Alibaba官方文档

1.SpringCloud Alibaba 之 Nacos

①Nacos 主要功能

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

    Nacos 可以说就是 注册中心+配置中心 的组合,等价于:Nacos = Eureka+Config+Bus

②Nacos这么强大,那具体怎么使用呢?下面我们就一起探索

2.Nacos作为注册中心

安装Nacos方式一(windows):

1.下载:「nacos-server-1.1.4」https://www.aliyundrive.com/s/owtAZ27gNNd

点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

我把安装包放在了阿里云盘大家可以自行下载,也可以去GitHub下载:https://github.com/alibaba/nacos/archive/1.1.4.tar.gz

2.解压

3.启动命令: cmd startup.cmd 或者双击 startup.cmd 运行文件。

安装Nacos方式二(linux):使用Docker的方式

1.拉取需要的nacos镜像

docker pull nacos/nacos-server:【指定版本号】

2.在宿主机创建个docker文件夹专门来放docker容器相关的挂载数据

3.vim custom.properties编辑custom.properties文件,加上以下内容

【management.endpoints.web.exposure.include=*】

4.启动nacos容器:

docker run -d -p 8848:8848 -e MODE=standalone -v /docker/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /docker/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server

注册中心已经准备完毕,我们再基于 Nacos 注册中心创建服务提供者和消费者。

这里还是使用之前SpringCloud第一版一样的案例,用户微服务和电影微服务,查询用户信息可以查询电影信息(远程调用)

服务提供方

1.创建一个服务提供方电影微服务模块nacos-provider-movie6600

2.修改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qbb</groupId>
<artifactId>nacos-provider-movie6600</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider-movie6600</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties> <dependencies> <dependency>
<groupId>com.qbb</groupId>
<artifactId>cloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> <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>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.qbb.cloud2022.NacosProviderMovie6600Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

3.写yml文件

server:
port: 6600 spring:
application:
name: nacos-provider-movie cloud:
nacos:
discovery:
server-addr: 192.168.137.72:8848 #nacos服务端地址
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
username: root
password: root

4.主启动类

package com.qbb.cloud2022;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @MapperScan("com.qbb.cloud2022.mapper")
@EnableDiscoveryClient // 开启Nacos客户端服务
@SpringBootApplication
public class NacosProviderMovie6600Application { public static void main(String[] args) {
SpringApplication.run(NacosProviderMovie6600Application.class, args);
} }

5.业务

controller

package com.qbb.cloud2022.controller;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.service.MovieService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-02 22:42
* @Description:
*/
@RestController
@RequestMapping("/movie")
@Slf4j
public class MovieController { @Autowired
private MovieService movieService; @Value("${server.port}")
private String port; @GetMapping("/findById/{id}")
public Movie findById(@PathVariable("id") Integer id) {
log.info("port:{}", port);
return movieService.findById(id);
}
}

service

package com.qbb.cloud2022.service.impl;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.mapper.MovieMapper;
import com.qbb.cloud2022.service.MovieService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-02 22:45
* @Description:
*/
@Service
public class MovieServiceImpl implements MovieService { @Autowired
private MovieMapper movieMapper; @Override
public Movie findById(Integer id) {
return movieMapper.findById(id);
}
}

mapper

package com.qbb.cloud2022.mapper;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import org.apache.ibatis.annotations.Select; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-02 22:46
* @Description:
*/
public interface MovieMapper {
@Select("select * from movie where id=#{id}")
Movie findById(Integer id);
}

测试一下:

服务消费方

1.创建一个服务消费方电影微服务模块nacos-provider-movie6600

2.修改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qbb</groupId>
<artifactId>nacos-consumer-user6700</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-consumer-user6700</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties> <dependencies>
<dependency>
<groupId>com.qbb</groupId>
<artifactId>cloud-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<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>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.qbb.cloud2022.NacosConsumerUser6700Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

3.写yml文件

server:
port: 6700 spring:
application:
name: nacos-consumer-user cloud:
nacos:
discovery:
server-addr: 192.168.137.72:8848
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
username: root
password: root

4.主启动类

package com.qbb.cloud2022;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @MapperScan("com.qbb.cloud2022.mapper")
@EnableDiscoveryClient // 开启nacos注册中心支持
@SpringBootApplication
public class NacosConsumerUser6700Application { public static void main(String[] args) {
SpringApplication.run(NacosConsumerUser6700Application.class, args);
} }

5.业务

controller

package com.qbb.cloud2022.controller;

import com.qbb.cloud2022.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Map; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 13:31
* @Description:
*/
@RestController
@RequestMapping("/user")
public class UserController { @Autowired
private UserService userService; @GetMapping("/findUserAndMovie/{id}")
public Map findUserAndMovie(@PathVariable("id") Integer id) {
Map<String, Object> map = userService.findUserAndMovie(id);
return map;
} }

service

package com.qbb.cloud2022.service.impl;

import com.qbb.cloud2022.com.qbb.springcloud.entity.User;
import com.qbb.cloud2022.mapper.UserMapper;
import com.qbb.cloud2022.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.HashMap;
import java.util.Map; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 13:32
* @Description:
*/
@Service
public class UserServiceImpl implements UserService { @Autowired
private UserMapper userMapper; @Override
public Map<String, Object> findUserAndMovie(Integer id) {
User user = userMapper.findById(id);
Map<String, Object> map = new HashMap<>();
map.put("user", user);
map.put("movie", null);
return map;
}
}

mapper

package com.qbb.cloud2022.mapper;

import com.qbb.cloud2022.com.qbb.springcloud.entity.User;
import org.apache.ibatis.annotations.Select; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 13:48
* @Description:
*/
public interface UserMapper {
@Select("select * from user where id=#{id}")
User findById(Integer id);
}

测试一下:

Nacos注册中心的服务信息:

上面我们是没有进行远程调用查询电影信息的,那么接下来我们可以使用OpenFeign实现远程的调用

1.导入OpenFeign的依赖

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

2.主启动类上加注解

@EnableFeignClients // 开启Feign远程调用支持

3.创建远程调用的接口FeignMovieService

package com.qbb.cloud2022.feign;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 19:56
* @Description:
*/
@FeignClient(value = "nacos-provider-movie") // value属性指定被调用服务的在注册中心的服务名
public interface FeignMovieService { @GetMapping("/movie/findById/{id}")
public Movie findById(@PathVariable("id") Integer id);
}

测试一下:

我们查看Nacos的依赖会发现导入Nacos依赖也会同时导入Ribbon的依赖,所以可以说Nacos天生就自带负载均衡策略

我们将电影微服务copy两份,测试一下负载均衡效果,Ribbon默认是轮训的策略进,看看Nacos中是否也是

右键电影微服务,选择Copy Configuration

修改相关参数

运行相关的四个微服务

远程调用测试一下

可以看出的确是轮训的方式,那么我想修改负载均衡策略该怎么办呢?

Nacos为我们提供了两种凡是实现负载均衡策略

方式一:和原来一样,整一个配置类提供相应的IRule实现类对象

package com.qbb.cloud2022.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 20:22
* @Description:
*/
@Configuration
public class IRuleConfig { @Bean
public IRule iRule(){
return new RandomRule(); // 使用随机的负载均衡策略
}
}

方式二:yml配置文件方式(当然也可以自定义的)

stock-service:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
eager-load:
enabled: true #开启ribbon饥饿加载
clients: stock-service #配置stock-service使用ribbon饥饿加载,多个使用逗号分隔

接下来我们使用Nacos整合一下Hystrix,实现服务熔断,降级,限流

导入Hystrix依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>

主启动上加入注解

@EnableCircuitBreaker // 开启Hystrix

创建一个兜底的处理器,实现远程调用的方法进行兜底

package com.qbb.cloud2022.handler;

import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
import com.qbb.cloud2022.feign.FeignMovieService;
import org.springframework.stereotype.Component; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-03 20:42
* @Description:
*/
@Component
public class FeignMovieServiceExceptionHandler implements FeignMovieService { @Override
public Movie findById(Integer id) {
Movie movie = new Movie();
movie.setId(-1);
movie.setName("网络故障,请稍后再试");
return movie;
}
}

注意别忘记在yml文件中配置

feign:
hystrix:
enabled: true # 开启feign对hystrix的支持

修改服务端代码,关闭所有的服务端和重启消费端,测试一下

Nacos 与其他服务注册中心对比

3.Nacos中的数据模型

Namespace 命名空间、Group 分组、集群这些都是为了进⾏归类管理,把服务和配置⽂件进⾏归类,归类之后就可以实 现⼀定的效果, ⽐如,对于服务来说,不同命名空间中的服务不能够互相访问调⽤。

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境、测试环境和⽣产环境
  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组,通常习惯⼀个系统归为⼀个组
  • Service:某⼀个服务,⽐如简历微服务
  • DataId:配置集或者可以认为是⼀个配置⽂件

推荐用法:

服务的分级存储模型

每个服务也可以组成多个集群,多个集群又包含了多个实例.并且微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。

如何给服务分配集群呢?

重启微服务:

访问:http://localhost:6700/user/findUserAndMovie/1 发现,默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡, 因此 Nacos 中提供了一个 NacosRule的实现,可以优先从同集群中挑选实例。

nacos-provider-movie: #被调用方在nacos注册中心的服务名
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

权重配置:

如果权重修改为 0,则该实例永远不会被访问,可以实现无缝上线应用

环境隔离

同一个命名空间下的服务是可以相互调用的,反之则不能

我现在修改nacos-provider-movie6600的namespace

namespace: 3ad61d82-3435-4729-86e2-57f828280e9f # 修改namespace环境

重启测试:

注意在Nacos分为两种实例,临时实例和永久实例(eureka只有临时实例),临时实例采用心跳模式,非临时实例采用主动检测模式

修改yml配置文件可以将实例设置为永久实例.这样即使实例宕机了,Nacos服务端也不会将其剔除,等宕机的服务重新启动了,又会自动注册进注册中心

ephemeral: true # 将此服务设置为永久实例

Nacos没有永久实例时,遵循AP(可用性,分区容错性!eureka也是如此),有永久实例时,遵循CP(强一致性,分区容错性)

当我把服务nacos-provider-movie6600关掉,会发现Nacos并不会将服务剔除掉

4.Nacos作为配置中心

Nacos 除了可以做注册中心,同样可以做配置管理来使用。nacos 作为配置中心可以做到系统配置的集中管理(编辑、 存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。有 Nacos 之后,分布式配置就简单很多 Github 不需要了(配置信息直接配置在 Nacos server 中),Bus 也不需要了(依然可 以完成配置文件的热更新, 及时通知微服务)。如果微服务架构中没有使用统一配置中心时,所存在的问题:

  • 配置文件分散在各个项目⾥,微服务实例的数量达到上百个的时候,实在是不方便维护
  • 配置内容安全与权限
  • 更新配置后,项目需要重启,即使不需要重启也需要运维人员使用curl发送请求执行更新

添加配置文件

注意dataId格式

1.prefix 默认为所属工程配置spring.application.name 的值(nacos-provider-movie*),也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

2.spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为 空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

3.file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

上面我们在Nacos中创建了一个配置文件,接下来我们怎么在微服务中使用呢?

1.导入Nacos作为配置中心的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.在bootstrap.yml文件中添加如下配置

spring:
cloud:
nacos:
server-addr: 192.168.137.72:8848
config:
file-extension: yml # 配置文件默认的后缀是properties文件,如果是yml,必须指定
profiles:
active: dev

3.编写测试代码

package com.qbb.cloud2022.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-06 18:49
* @Description:
*/
@RestController
public class HelloController {
@Value("${user.age}")
private Integer age; @GetMapping("/hello")
public Integer hello() {
return age;
}
}

4.结果

5.那如何实现修改配置中心的文件实现热加载呢?

只需要在指定位置加上注解@RefreshScope 实现自动更新

@RefreshScope

名称空间切换环境

创建两个环境分别为dev和test

将public中的配置文件clone到dev和test环境

修改dev和test环境配置文件的内容

配置namespace

namespace: c6ab48bd-2159-450e-aef8-65095e015036 # 指定环境变量的唯一标识

测试一下

配置文件回滚到某个历史版本

加载多配置文件

在dev命名空间下创建mysql.yml,redis.yml

修改bootstrap.yml

 extension-configs:
- dataId: mysql.yml
refresh: true
- dataId: redis.yml
refresh: true

修改controller层代码

package com.qbb.cloud2022.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-04-06 18:49
* @Description:
*/
@RestController
@RefreshScope
public class HelloController { @Value("${user.age}")
private Integer age; @Value("${mysql.port}")
private Integer mysqlPort; @Value("${redis.port}")
private Integer redisPort; @GetMapping("/hello1")
public String hello1() {
return "age:" + age + "=mysql:" + mysqlPort + "=redis:" + redisPort;
} @GetMapping("/hello")
public Integer hello() {
return age;
}
}

测试一下:

我们还可以给配置文件添加group

group: order # 用于区分业务

由于我们nacos配置中心并没有order这个组,所以启动报错了

我们添加一个order组试试

修改两个order组的配置文件内容,具体内容大家自行修改就好了,直接测试

SpringCloud Alibaba入门之Nacos(SCA)的更多相关文章

  1. Spring Cloud Alibaba入门实战之nacos(一)

    Spring Cloud Alibaba入门实战之nacos(一) 前情介绍 ​ Spring Cloud Alibaba 是阿里巴巴提供的新一代的微服务解决方案,相信会有越来越多采用微服务架构的公司 ...

  2. 微服务入门三:SpringCloud Alibaba

    一.什么是SpringCloud Alibaba 1.简介 1)简介 阿里云未分布式应用开发提供了一站式解决方案.它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发 ...

  3. SpringCloud Alibaba之Nacos

    一.运行Nacos Nacos GitHub开源地址:https://github.com/alibaba/nacos Nacos 官方文档:https://nacos.io/zh-cn/docs/q ...

  4. SpringCloud Alibaba Nacos 服务注册

    业务服务接入Nacos服务治理中心 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/ 创建bom工程用于管理依赖(下方附加源码地址) 准备工作完成后开始接 ...

  5. SpringCloud Alibaba Nacos服务注册与配置管理

    Nacos SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos:Dynamic Naming and Configurat ...

  6. SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...

  7. 【springcloud alibaba】配置中心之nacos

    接着上一篇的[springcloud alibaba]注册中心之nacos,这一篇主要讲nacos的配置中心能力.nacos的集群部署及持久化请看上一篇. ---------------------- ...

  8. 【springcloud alibaba】注册中心之nacos

    1.为什么需要注册中心 1.1 没有注册中心会怎么样 1.2 注册中心提供什么功能以及解决什么问题 2.常用的微服务注册中心对比 3.案例项目父工程 4.nacos作为注册中心的使用 4.1 单机版的 ...

  9. Spring Cloud Alibaba基础教程-Nacos(一)

    2019快结束,也有很久没写博客了,今天我们来谈谈Nacos,如果对您有帮助,麻烦左上角点个关注 ,谢谢 ! 嘻嘻 今天先写第一篇 文章目录 为什么要使用Nacos Eureka 闭源 Nacos的优 ...

随机推荐

  1. 2022年官网下安装MAVEN最全版与官网查阅方法

    目录 确保JDK安装无误 一.百度输入关键字maven,选择官网,进入官网 二.找到下载位置,如图所示,双击进入 三.找到下载位置(下载的是安装包bin版本的,src是源码查看),双击下载 四.弹出保 ...

  2. Java子类继承父类的执行顺序

    父类的静态代码块(static) 子类的静态代码块(static) 父类的非静态代码块(父类成员初始化) 父类的构造方法 子类的非静态代码块(子类成员初始化) 子类的构造方法

  3. git commit 后,没有push ,怎么撤销

    如果是撤销到commit 之前,本地修改也放弃,可以 使用git  reset --hard , 但是想保留本地修改,也想撤销commit 可以使用 git reset  --mixed  HEAD^ ...

  4. 网络编程 并发socketserver

    网络编程 并发socketserver ipv4.ipv6 ip协议:规定网络地址的协议 B/S架构 C/S架构 bs是cs的一种 B/S是浏览器和服务端架构 C/S是客户端和服务端架构 osi七层协 ...

  5. cute

    环境准备 将靶机导入后将网络设置为NAT kali:192.168.0.102 cute:192.168.0.107 端口扫描 使用nmap对靶机进行端口扫描 nmap –A –p- 192.168. ...

  6. redis之 主从复制和哨兵(一)

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...

  7. Kafka03--Kafka消费者使用方式

    前言 与生产者客户端一样,消费者端也由最初的scala版本过渡到现在的Java版本. 正常的消费者逻辑需要以下4个步骤: KafkaConsumer的客户端参数配置和对应实例: 订阅主题 拉取消息并消 ...

  8. springboot使用@Value注入properties文件中的值,中文乱码

    最近开发一个需求,讲一个中文值配置在properties文件中,然后代码中使用@Value注解进行注入使用,然而出现了如下状况: 中文出现乱码,将代码修改如下: String str = new St ...

  9. 面试问题之C++语言:说一说C++中四种cast转换

    C++中四种类型转换是:static_cast.dynamic_cast.const_cast.reinterpret_cast 1.const_cast 常量转换,用于将const变量转为非cons ...

  10. springboot-访问数据库

    在springboot中,默认的JPA实现是Hibernate,JPA是Java Persistence API的简称,中文名Java持久层API <!--数据库--> <depen ...