spring cloud alibaba 一

微信图片_20221030191700

spring cloud Alibaba

Spring Cloud阿里为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。

使用Spring Cloud阿里,您只需要添加一些注释和少量配置,就可以将Spring Cloud应用连接到阿里的分布式解决方案上,并使用阿里中间件构建一个分布式应用系统

Nacos

Nacos(NAming COnfiguration Service):服务注册和配置中心

Nacos = Eureka + Config + Bus

Nacos概念

  • 地域 (Region)

物理的数据中心,资源创建成功后不能更换。

  • 可用区(Available Zone)

同一地域内,电力和网络互相独立的物理区域。同一可用区内,实例的网络延迟较低。

  • 接入点(Endpoint)

地域的某个服务的入口域名。

  • 命名空间(Namespace)

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

  • 配置 (Configuration)

在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。

  • 配置管理 (Configuration Management)

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。

  • 配置项 (Configuration Item)

一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。

  • 配置集 (Configuration Set)

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

  • 配置集 ID(Data ID)

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

  • 配置分组(Group)

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

  • 配置快照 (Configuration Snapshot)

Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。

  • 服务(Service)

通过预定义接口网络访问的提供给客户端的软件功能。

  • 服务名(Service Name)

服务提供的标识,通过该标识可以唯一确定其指代的服务。

  • 服务注册中心(Service Registry)

存储服务实例和服务负载均衡策略的数据库。

  • 服务发现(Service Discovery)

在计算机网络上,(通常使用服务名)对服务下的实例的地址和元数据进行探测,并以预先定义的接口提供给客户端进行查询。

  • 元信息(Metadata)

Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

  • 应用(Application)

用于标识服务提供方的服务的属性。

  • 服务分组(Service Group)

不同的服务可以归类到同一分组。

  • 虚拟集群(Virtual Cluster)

同一个服务下的所有服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群。

  • 实例(Instance)

提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。

  • 权重(Weight)

实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。

  • 健康检查(Health Check)

以指定方式检查服务下挂载的实例 (Instance) 的健康度,从而确认该实例 (Instance) 是否能提供服务。根据检查结果,实例 (Instance) 会被判断为健康或不健康。对服务发起解析请求时,不健康的实例 (Instance) 不会返回给客户端。

  • 健康保护阈值(Protect Threshold)

为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康 健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例 (Instance) 占总服务实例 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。

Nacos功能

  • 服务限流降级

  • 服务注册与发现

  • 消息驱动能力

  • 分布式事务

  • 阿里云对象存储

  • 分布式任务调度

  • 阿里云短信服务

Nacos组件

  • Sentinel

把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  • Nacos

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • RocketMQ

一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

  • Dubbo

Apache Dubbo™ 是一款高性能 Java RPC 框架。

  • Seata

阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

  • Alibaba Cloud OSS

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

  • Alibaba Cloud SchedulerX

阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

  • Alibaba Cloud SMS

覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道

以上信息来源于官网

注册中心对比

服务注册与服务框架 CAP模型 控制台管理 社区活跃度
Eureka AP高可用 支持 低(2.x版本闭源)
Zookeeper CP一致 支持
Consul CP 支持
Nacos AP+CP 支持

acos切换 AP 和 CP模式

1
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

nacos下载以及使用

下载地址

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

下载之后进入bin目录运行

1
startup.cmd -m standalone

运行成功即可访问http://localhost:8848/nacos/index.html

默认账号密码都是nacos

Nacos

注册中心搭建

provider模块

  • 父模块pom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dream.xiaobo</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba</name>
<description>spring-cloud-alibaba</description>
<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>

<!-- 控制版本绑定-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>

</dependencies>
</dependencyManagement>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
  • pom
1
2
3
4
5
6
7
8
9
10
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • application.yml
1
2
3
4
5
6
7
8
9
10
server:
port: 8000

spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
  • controller
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping(value = "/goods")
public class ProviderController {

@Value("${server.port}")
private Integer port;

@GetMapping(value = "/findById/{id}")
public String findById(@PathVariable Integer id){

return "nacos provider port:"+port+"|id:"+id;
}
}
  • app
1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApp {

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

相同方式再创建一个provider

consumer模块

  • pom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 替代了netflix的ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

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

</dependencies>
  • application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 9000 # 端口号

spring:
application:
name: nacos-consumer # 服务名
cloud:
loadbalancer:
ribbon:
enabled: false # 关闭ribbon负载均衡
nacos:
discovery:
server-addr: localhost:8848
  • config
1
2
3
4
5
6
7
8
9
10
@Configuration
public class RestTemplateConfig {

@Bean
@LoadBalanced //LoadBalancer 负载均衡
public RestTemplate restTemplate(){

return new RestTemplate();
}
}
  • opfeign
1
2
3
4
5
6
@FeignClient("nacos-provider")
public interface GoodsFeign {

@GetMapping(value = "/goods/findById/{id}")
public String findById(@PathVariable Integer id);
}
  • controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@RestController
@RequestMapping(value = "/order")
public class OrderController {

@Autowired
private RestTemplate restTemplate;

@Autowired
private GoodsFeign goodsFeign;

/**
* balancer形式
* @param id
* @return
*/
@GetMapping(value = "/add/{id}")
public String add(@PathVariable Integer id){

String result = restTemplate.getForObject("http://nacos-provider/goods/findById/"+id, String.class);

return result;
}

/**
* Feign形式
* @param id
* @return
*/
@GetMapping(value = "/add2/{id}")
public String add2(@PathVariable Integer id){

return goodsFeign.findById(id);
}
}
  • app
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApp {

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

配置中心搭建

  • pom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

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

</dependencies>
  • application.yml
1
2
3
4
5
spring:
profiles:
active: prod # 生产环境
# active: test # 测试环境
# active: dev # 开发环境
  • bootstrap.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 7777

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: BJ_GROUP # 分组
namespace: 14c5a736-9f4c-42b9-aed1-22dcf5386d61 # 命名空间


#${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
  • controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping(value = "/config")
@RefreshScope //刷新功能
public class ConfigClientController {

@Value("${name}")
private String name;

@GetMapping(value = "/name")
public String getName() {

return name;
}
}
  • app
1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigApp {

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

nacos配置中心

集群和持久化配置

持久化

nacos是存到临时的文件夹目录中的,所以需要持久化,持久化到DB中

  • 修改application.properteis配置文件
1
2
3
4
5
6
7
spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://192.168.117.200:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=xiaobo

集群

需要环境

64 bit OS Linux/Unix/Mac 推荐Linux系统
64 bit JDK 1.8+
Maven 3.2.x+
mysql 8.0
3个或3个以上Nacos节点才能构成集群

  • 解压
1
tar -zxvf nacos-server-2.0.4.tar.gz
  • 修改cluster.conf文件,添加服务器地址
1
2
3
4
#example
192.168.117.200:6666
192.168.117.200:7777
192.168.117.200:8888
  • 然后复制3出来设置不同端口模拟多台服务器

  • 修改启动参数
    vim startup.sh

1
2
3
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

修改成这个样子,但是如果你虚拟机分配的内存够用也不用修改,我的分配的不够,电脑配置有点拉

  • bin目录启动
1
sh startup.sh

Nginx做负载均衡

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
#gzip  on;
upstream cluster{
server 192.168.117.200:6666;
server 192.168.117.200:7777;
server 192.168.117.200:8888;
}
location / {
#root html;
#index index.html index.htm;
proxy_pass http://cluster;
}

server { listen 5555;端口号也改下

启动nginx即可完成

正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……

-------------本文结束 感谢您的阅读-------------

本文标题:spring cloud alibaba 一

文章作者:小博

发布时间:2022年10月30日 - 19:20

最后更新:2022年10月30日 - 19:22

原始链接:https://codexiaobo.github.io/posts/668782996/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。