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镜像

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

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

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

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

4.启动nacos容器:

  1. 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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.qbb</groupId>
  6. <artifactId>nacos-provider-movie6600</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>nacos-provider-movie6600</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>com.qbb</groupId>
  20. <artifactId>cloud-common</artifactId>
  21. <version>0.0.1-SNAPSHOT</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.alibaba.cloud</groupId>
  29. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. <version>2.1.4</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>mysql</groupId>
  38. <artifactId>mysql-connector-java</artifactId>
  39. <scope>runtime</scope>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.projectlombok</groupId>
  43. <artifactId>lombok</artifactId>
  44. <optional>true</optional>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. <exclusions>
  51. <exclusion>
  52. <groupId>org.junit.vintage</groupId>
  53. <artifactId>junit-vintage-engine</artifactId>
  54. </exclusion>
  55. </exclusions>
  56. </dependency>
  57. </dependencies>
  58. <dependencyManagement>
  59. <dependencies>
  60. <dependency>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-dependencies</artifactId>
  63. <version>${spring-boot.version}</version>
  64. <type>pom</type>
  65. <scope>import</scope>
  66. </dependency>
  67. <dependency>
  68. <groupId>com.alibaba.cloud</groupId>
  69. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  70. <version>${spring-cloud-alibaba.version}</version>
  71. <type>pom</type>
  72. <scope>import</scope>
  73. </dependency>
  74. </dependencies>
  75. </dependencyManagement>
  76. <build>
  77. <plugins>
  78. <plugin>
  79. <groupId>org.apache.maven.plugins</groupId>
  80. <artifactId>maven-compiler-plugin</artifactId>
  81. <version>3.8.1</version>
  82. <configuration>
  83. <source>1.8</source>
  84. <target>1.8</target>
  85. <encoding>UTF-8</encoding>
  86. </configuration>
  87. </plugin>
  88. <plugin>
  89. <groupId>org.springframework.boot</groupId>
  90. <artifactId>spring-boot-maven-plugin</artifactId>
  91. <version>2.3.7.RELEASE</version>
  92. <configuration>
  93. <mainClass>com.qbb.cloud2022.NacosProviderMovie6600Application</mainClass>
  94. </configuration>
  95. <executions>
  96. <execution>
  97. <id>repackage</id>
  98. <goals>
  99. <goal>repackage</goal>
  100. </goals>
  101. </execution>
  102. </executions>
  103. </plugin>
  104. </plugins>
  105. </build>
  106. </project>

3.写yml文件

  1. server:
  2. port: 6600
  3. spring:
  4. application:
  5. name: nacos-provider-movie
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.137.72:8848 #nacos服务端地址
  10. # 数据源
  11. datasource:
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
  14. username: root
  15. password: root

4.主启动类

  1. package com.qbb.cloud2022;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. @MapperScan("com.qbb.cloud2022.mapper")
  7. @EnableDiscoveryClient // 开启Nacos客户端服务
  8. @SpringBootApplication
  9. public class NacosProviderMovie6600Application {
  10. public static void main(String[] args) {
  11. SpringApplication.run(NacosProviderMovie6600Application.class, args);
  12. }
  13. }

5.业务

controller

  1. package com.qbb.cloud2022.controller;
  2. import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
  3. import com.qbb.cloud2022.service.MovieService;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. /**
  12. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  13. * @version 1.0
  14. * @date 2022-04-02 22:42
  15. * @Description:
  16. */
  17. @RestController
  18. @RequestMapping("/movie")
  19. @Slf4j
  20. public class MovieController {
  21. @Autowired
  22. private MovieService movieService;
  23. @Value("${server.port}")
  24. private String port;
  25. @GetMapping("/findById/{id}")
  26. public Movie findById(@PathVariable("id") Integer id) {
  27. log.info("port:{}", port);
  28. return movieService.findById(id);
  29. }
  30. }

service

  1. package com.qbb.cloud2022.service.impl;
  2. import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
  3. import com.qbb.cloud2022.mapper.MovieMapper;
  4. import com.qbb.cloud2022.service.MovieService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  9. * @version 1.0
  10. * @date 2022-04-02 22:45
  11. * @Description:
  12. */
  13. @Service
  14. public class MovieServiceImpl implements MovieService {
  15. @Autowired
  16. private MovieMapper movieMapper;
  17. @Override
  18. public Movie findById(Integer id) {
  19. return movieMapper.findById(id);
  20. }
  21. }

mapper

  1. package com.qbb.cloud2022.mapper;
  2. import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
  3. import org.apache.ibatis.annotations.Select;
  4. /**
  5. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  6. * @version 1.0
  7. * @date 2022-04-02 22:46
  8. * @Description:
  9. */
  10. public interface MovieMapper {
  11. @Select("select * from movie where id=#{id}")
  12. Movie findById(Integer id);
  13. }

测试一下:

服务消费方

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

2.修改pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.qbb</groupId>
  6. <artifactId>nacos-consumer-user6700</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>nacos-consumer-user6700</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>com.qbb</groupId>
  20. <artifactId>cloud-common</artifactId>
  21. <version>0.0.1-SNAPSHOT</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.alibaba.cloud</groupId>
  29. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. <version>2.1.4</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>mysql</groupId>
  38. <artifactId>mysql-connector-java</artifactId>
  39. <scope>runtime</scope>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.projectlombok</groupId>
  43. <artifactId>lombok</artifactId>
  44. <optional>true</optional>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. <exclusions>
  51. <exclusion>
  52. <groupId>org.junit.vintage</groupId>
  53. <artifactId>junit-vintage-engine</artifactId>
  54. </exclusion>
  55. </exclusions>
  56. </dependency>
  57. </dependencies>
  58. <dependencyManagement>
  59. <dependencies>
  60. <dependency>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-dependencies</artifactId>
  63. <version>${spring-boot.version}</version>
  64. <type>pom</type>
  65. <scope>import</scope>
  66. </dependency>
  67. <dependency>
  68. <groupId>com.alibaba.cloud</groupId>
  69. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  70. <version>${spring-cloud-alibaba.version}</version>
  71. <type>pom</type>
  72. <scope>import</scope>
  73. </dependency>
  74. </dependencies>
  75. </dependencyManagement>
  76. <build>
  77. <plugins>
  78. <plugin>
  79. <groupId>org.apache.maven.plugins</groupId>
  80. <artifactId>maven-compiler-plugin</artifactId>
  81. <version>3.8.1</version>
  82. <configuration>
  83. <source>1.8</source>
  84. <target>1.8</target>
  85. <encoding>UTF-8</encoding>
  86. </configuration>
  87. </plugin>
  88. <plugin>
  89. <groupId>org.springframework.boot</groupId>
  90. <artifactId>spring-boot-maven-plugin</artifactId>
  91. <version>2.3.7.RELEASE</version>
  92. <configuration>
  93. <mainClass>com.qbb.cloud2022.NacosConsumerUser6700Application</mainClass>
  94. </configuration>
  95. <executions>
  96. <execution>
  97. <id>repackage</id>
  98. <goals>
  99. <goal>repackage</goal>
  100. </goals>
  101. </execution>
  102. </executions>
  103. </plugin>
  104. </plugins>
  105. </build>
  106. </project>

3.写yml文件

  1. server:
  2. port: 6700
  3. spring:
  4. application:
  5. name: nacos-consumer-user
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 192.168.137.72:8848
  10. # 数据源
  11. datasource:
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://localhost:3306/qbbit3?serverTimezone=UTC
  14. username: root
  15. password: root

4.主启动类

  1. package com.qbb.cloud2022;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. @MapperScan("com.qbb.cloud2022.mapper")
  7. @EnableDiscoveryClient // 开启nacos注册中心支持
  8. @SpringBootApplication
  9. public class NacosConsumerUser6700Application {
  10. public static void main(String[] args) {
  11. SpringApplication.run(NacosConsumerUser6700Application.class, args);
  12. }
  13. }

5.业务

controller

  1. package com.qbb.cloud2022.controller;
  2. import com.qbb.cloud2022.service.UserService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import java.util.Map;
  9. /**
  10. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  11. * @version 1.0
  12. * @date 2022-04-03 13:31
  13. * @Description:
  14. */
  15. @RestController
  16. @RequestMapping("/user")
  17. public class UserController {
  18. @Autowired
  19. private UserService userService;
  20. @GetMapping("/findUserAndMovie/{id}")
  21. public Map findUserAndMovie(@PathVariable("id") Integer id) {
  22. Map<String, Object> map = userService.findUserAndMovie(id);
  23. return map;
  24. }
  25. }

service

  1. package com.qbb.cloud2022.service.impl;
  2. import com.qbb.cloud2022.com.qbb.springcloud.entity.User;
  3. import com.qbb.cloud2022.mapper.UserMapper;
  4. import com.qbb.cloud2022.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  11. * @version 1.0
  12. * @date 2022-04-03 13:32
  13. * @Description:
  14. */
  15. @Service
  16. public class UserServiceImpl implements UserService {
  17. @Autowired
  18. private UserMapper userMapper;
  19. @Override
  20. public Map<String, Object> findUserAndMovie(Integer id) {
  21. User user = userMapper.findById(id);
  22. Map<String, Object> map = new HashMap<>();
  23. map.put("user", user);
  24. map.put("movie", null);
  25. return map;
  26. }
  27. }

mapper

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

测试一下:

Nacos注册中心的服务信息:

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

1.导入OpenFeign的依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. <version>2.2.2.RELEASE</version>
  5. </dependency>

2.主启动类上加注解

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

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

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

测试一下:

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

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

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

修改相关参数

运行相关的四个微服务

远程调用测试一下

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

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

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

  1. package com.qbb.cloud2022.config;
  2. import com.netflix.loadbalancer.IRule;
  3. import com.netflix.loadbalancer.RandomRule;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  8. * @version 1.0
  9. * @date 2022-04-03 20:22
  10. * @Description:
  11. */
  12. @Configuration
  13. public class IRuleConfig {
  14. @Bean
  15. public IRule iRule(){
  16. return new RandomRule(); // 使用随机的负载均衡策略
  17. }
  18. }

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

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

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

导入Hystrix依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  4. <version>2.2.2.RELEASE</version>
  5. </dependency>

主启动上加入注解

  1. @EnableCircuitBreaker // 开启Hystrix

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

  1. package com.qbb.cloud2022.handler;
  2. import com.qbb.cloud2022.com.qbb.springcloud.entity.Movie;
  3. import com.qbb.cloud2022.feign.FeignMovieService;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  7. * @version 1.0
  8. * @date 2022-04-03 20:42
  9. * @Description:
  10. */
  11. @Component
  12. public class FeignMovieServiceExceptionHandler implements FeignMovieService {
  13. @Override
  14. public Movie findById(Integer id) {
  15. Movie movie = new Movie();
  16. movie.setId(-1);
  17. movie.setName("网络故障,请稍后再试");
  18. return movie;
  19. }
  20. }

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

  1. feign:
  2. hystrix:
  3. enabled: true # 开启feign对hystrix的支持

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

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

3.Nacos中的数据模型

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

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

推荐用法:

服务的分级存储模型

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

如何给服务分配集群呢?

重启微服务:

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

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

权重配置:

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

环境隔离

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

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

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

重启测试:

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

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

  1. 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作为配置中心的依赖
  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  4. </dependency>

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

  1. spring:
  2. cloud:
  3. nacos:
  4. server-addr: 192.168.137.72:8848
  5. config:
  6. file-extension: yml # 配置文件默认的后缀是properties文件,如果是yml,必须指定
  7. profiles:
  8. active: dev

3.编写测试代码

  1. package com.qbb.cloud2022.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  7. * @version 1.0
  8. * @date 2022-04-06 18:49
  9. * @Description:
  10. */
  11. @RestController
  12. public class HelloController {
  13. @Value("${user.age}")
  14. private Integer age;
  15. @GetMapping("/hello")
  16. public Integer hello() {
  17. return age;
  18. }
  19. }

4.结果

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

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

  1. @RefreshScope

名称空间切换环境

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

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

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

配置namespace

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

测试一下

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

加载多配置文件

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

修改bootstrap.yml

  1. extension-configs:
  2. - dataId: mysql.yml
  3. refresh: true
  4. - dataId: redis.yml
  5. refresh: true

修改controller层代码

  1. package com.qbb.cloud2022.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.cloud.context.config.annotation.RefreshScope;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /**
  7. * @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
  8. * @version 1.0
  9. * @date 2022-04-06 18:49
  10. * @Description:
  11. */
  12. @RestController
  13. @RefreshScope
  14. public class HelloController {
  15. @Value("${user.age}")
  16. private Integer age;
  17. @Value("${mysql.port}")
  18. private Integer mysqlPort;
  19. @Value("${redis.port}")
  20. private Integer redisPort;
  21. @GetMapping("/hello1")
  22. public String hello1() {
  23. return "age:" + age + "=mysql:" + mysqlPort + "=redis:" + redisPort;
  24. }
  25. @GetMapping("/hello")
  26. public Integer hello() {
  27. return age;
  28. }
  29. }

测试一下:

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

  1. 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. CF594D题解

    我不会数据结构/kk 我想题意应该十分清楚了. 我们知道 \(\varphi(p^k)=p^{k-1}(p-1)\),那么我们考虑将一个询问下放到右端点,然后往右移动右端点并更新每个左端点到右端点的答 ...

  2. 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Redi ...

  3. vtk网格剖分

    #include <vtkSmartPointer.h> #include <vtkSimplePointsReader.h> #include <vtkPolyData ...

  4. 教你识别一些sequence的相关问题

    摘要:通过一些自定义的视图或者查询语句,批量识别集群的sequence相关问题 本文分享自华为云社区<GaussDB(DWS)运维 -- sequence常见运维操作>,作者: 譡里个檔. ...

  5. 把项目发布到tomcat中的方式

    1.相对路径方式1:把项目index.html放在tomcat的webapps/ROOT下,浏览器访问地址:http://www.aaa.com:8080/index.html 2.相对路径方式2:在 ...

  6. 使用 RabbitMQ 有什么好处?

    (1)服务间高度解耦 (2)异步通信性能高 (3)流量削峰

  7. java-中的代理

    静态代理: 例子: 接口: public interface InterfaceBase { void proxy(); } 接口实现类: public class InterfaceBaseReal ...

  8. java-IO异常处理

    以前的异常处理 public class Demo3 { public static void main(String[] args) { //提高fw的作用域 //变量定义的时候可以没有值,但是使用 ...

  9. 说出几点 Java 中使用 Collections 的最佳实践?

    这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...

  10. vue中的全局组件和局部组件的应用

    1全局组件 vue框架: https://www.vue-js.com/?tab=all 组件树 solt 内置分发组件 应用见局部组件 2局部组件 2.1局部组件的使用:生子 - 挂子 - 用子 & ...