code学习

spring cloud alibaba (一)

Spring Cloud Alibaba

官网:https://spring.io/projects/spring-cloud-alibaba

gitHub:https://github.com/alibaba/spring-cloud-alibaba

这节主要目标:

  • 掌握

    nacos

    使用
  • 了解服务与服务之间调用

1、简介

1.1、什么是分布式

将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式)

1.2、什么是Spring Cloud

spring cloud提供了一些可以让开发者快速构建分布式应用的工具。

主要解决了分布式中,服务注册发现,远程服务调用,负载均衡,配置中心,链路监控等组件问题。

1.3、什么是Spring Cloud Alibaba

Spring Cloud Alibaba 提供分布式应用开发的一站式解决方案。

它包含开发分布式应用程序所需的所有组件。

只需添加一些注解和少量配置,即可构建分布式应用系统。

基于Spring Cloud上进行改进。

1.4、Spring Cloud Alibaba相关组件

组件 作用
nacos 注册中心(服务注册与发现)、配置中心(动态配置管理)
Ribbon 负载均衡
Feign 声明式Http客户端(调用远程服务)
Sentinel 服务容错(限流、降级、熔断)
Gateway API网关(webflux编程模式)
Sleuth 调用链监控
Seata 原Fescar,即分布式事务解决方案

2、添加依赖

一定找对应

spirngboot

版本的

springcloud

版本。

一定要注意版本之间的兼容。

spring cloud alibaba (一)
spring cloud alibaba (一)

ub.com/alibaba/spring-cloud-alibaba

springcolud alibaba版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

添加

spring-cloud-alibaba-dependencies

<properties>
    <java.version>1.8</java.version>
    <spring.cloud.version>2021.0.3</spring.cloud.version> <spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.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>
           

3、Nacos

nacos github:https://github.com/alibaba/nacos/

nacos官方文档:https://nacos.io/zh-cn/

提供了分布式中的服务注册与发现和配置中心管理功能。

3.1、nacos安装

安装有很多方法:

1、从 最新稳定版本 下载

nacos-server-$version.zip

包。

2、通过docker管理。

docker run --name nacos -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:v2.1.1
           

安装成功后访问,

http://localhost:8848/nacos/#/login

默认账号密码:nacos

spring cloud alibaba (一)

3.2、服务注册

1、引用依赖

<!--nacos服务注册/发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
           

2、添加配置,开启注解

application.properties

或者使用

application.yaml

server.port=8081
spring.application.name=a-demo
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
           

在启动类上开启注解

// 开启服务注册
@EnableDiscoveryClient
@SpringBootApplication
public class ADemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ADemoApplication.class, args);
    }

}
           

3.3、启动项目,在Nacos 控制台上看到已注册的服务

spring cloud alibaba (一)

3.3、配置中心

从nacos引用配置,方便管理

1、引用依赖

<!--nacos配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--解决版本太高了,无法读取bootstrap.yml文件-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
           

2、添加配置

bootstrap.properties

采用

bootstrap

是因为优先级高。

spring.application.name=a-demo
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
           

默认配置名:

${spring.application.name}.properties

3、添加naocs配置,测试。

spring cloud alibaba (一)

a-demo.properties

spring cloud alibaba (一)
spring cloud alibaba (一)

4、测试

@SpringBootApplication
@EnableDiscoveryClient
public class ADemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ADemoApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :" +userName+"; age: "+userAge);
//        SpringApplication.run(ADemoApplication.class, args);
    }

}
           
spring cloud alibaba (一)

3.4、配置yaml格式

配置中心可以配置

yaml

格式

1、配置文件

bootstrap.properties

spring.cloud.nacos.config.file-extension=yaml
           

2、在nacos上添加配置。

spring cloud alibaba (一)

测试:

spring cloud alibaba (一)

3.5、动态加载

1、默认是动态加载。

// 自动刷新配置,放在配置类上即可。
// @RefreshScope
           

3.6、命名空间

命名空间用于隔离不同用户的配置。

典型场景是不同环境的配置隔离,例如开发/测试环境和生产环境的隔离。

1、创建新的命名空间

spring cloud alibaba (一)

2、使用新的命名空间

spring cloud alibaba (一)

bootstrap.properties

spring.cloud.nacos.config.namespace=f11392fe-84e0-48a1-9da5-71052b6a3af1
           

在新命名空间,创建文件并测试

spring cloud alibaba (一)

测试:

spring cloud alibaba (一)

服务也可以注册到不同的命名空间上

spring.cloud.nacos.discovery.namespace=f11392fe-84e0-48a1-9da5-71052b6a3af1
           

3.7、GROUP分组

可以根据分组不同,选择不同的配置。

1、创建新的分组测试

spring cloud alibaba (一)

bootstrap.properties

spring.cloud.nacos.config.group=DEV_GROUP
           

3.8、公共配置

存在一个配置,多个项目共用配置使用情况。

# 公共配置的 data-id,支持一个应用程序的多个配置,通过下标来指向。
spring.cloud.nacos.config.ext-config[0].data-id=config-common01.properties
# 指定分组,默认DEFAULT_GROUP(非必需)
spring.cloud.nacos.config.ext-config[0].group=GLOBALE_GROUP
# 开启动态配置(非必需)
spring.cloud.nacos.config.ext-config[0].refresh=true
           

spring.cloud.nacos.config.ext-config[n].data-id

。n值越大,优先级越高。

更清晰表示多个项目与配置之间的关联,还可以:

# 多个数据 id,用逗号分隔
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
# 指定动态更新配置
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
           

数据Id必须有文件扩展名,可以是

properties

或者

yaml/yml

4、Feign

用于服务与服务之间的调用

声明式,HTTP 形式的 API

例如,a服务调用b服务的接口。

服务都需要在nacos上注册。

spring cloud alibaba (一)

4.1、添加依赖

<!-- openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 负载均衡(不添加openfeign会报错) -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
           

4.2、启动类添加注解

@EnableFeignClients
           

4.3、添加接口

1、添加调用接口

// 调用 b-demo 服务下的方法
@FeignClient(name = "b-demo")
public interface BdemoServcieFeignClient {

    @GetMapping("/list")
    String list();
}
           

2、添加服务的接口

b服务的

controller

@RestController
public class IndexController {

    @GetMapping("/list")
    public String list(){
        return "这是 B 服务的接口";
    }
}
           

3、a服务调用b服务的接口

@RestController
public class IndexController {

    @Autowired
    BdemoServcieFeignClient bdemoServcieFeignClient;

    @GetMapping("/list")
    public String getConfig(){
        String str = bdemoServcieFeignClient.list();
        return "A服务+"+ str;
    }
}
           

启动项目测试:

spring cloud alibaba (一)

4.4、服务不在线时

如果在调用服务不在线,会报错。

spring cloud alibaba (一)

后端控制台:

spring cloud alibaba (一)

我们下次继续讲

Gateway

网关。

spring cloud alibaba 2021.0.1.0

官方文档:

https://spring-cloud-alibaba-group.github.io/github-pages/2021/en-us/index.html#_introduction