spring cloud Alibaba Spring Cloud阿里为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。
使用Spring Cloud阿里,您只需要添加一些注释和少量配置,就可以将Spring Cloud应用连接到阿里的分布式解决方案上,并使用阿里中间件构建一个分布式应用系统
Nacos Nacos(NAming COnfiguration Service):服务注册和配置中心
Nacos = Eureka + Config + Bus
Nacos概念
物理的数据中心,资源创建成功后不能更换。
同一地域内,电力和网络互相独立的物理区域。同一可用区内,实例的网络延迟较低。
地域的某个服务的入口域名。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
配置管理 (Configuration Management)
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
配置快照 (Configuration Snapshot)
Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。
通过预定义接口网络访问的提供给客户端的软件功能。
服务提供的标识,通过该标识可以唯一确定其指代的服务。
存储服务实例和服务负载均衡策略的数据库。
在计算机网络上,(通常使用服务名)对服务下的实例的地址和元数据进行探测,并以预先定义的接口提供给客户端进行查询。
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
用于标识服务提供方的服务的属性。
不同的服务可以归类到同一分组。
同一个服务下的所有服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群。
提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。
实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。
以指定方式检查服务下挂载的实例 (Instance) 的健康度,从而确认该实例 (Instance) 是否能提供服务。根据检查结果,实例 (Instance) 会被判断为健康或不健康。对服务发起解析请求时,不健康的实例 (Instance) 不会返回给客户端。
健康保护阈值(Protect Threshold)
为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康 健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例 (Instance) 占总服务实例 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。
Nacos功能
服务限流降级
服务注册与发现
消息驱动能力
分布式事务
阿里云对象存储
分布式任务调度
阿里云短信服务
Nacos组件
把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Apache Dubbo™ 是一款高性能 Java RPC 框架。
阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
以上信息来源于官网
注册中心对比
服务注册与服务框架
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
注册中心搭建 provider模块
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 /> </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 >
1 2 3 4 5 6 7 8 9 10 <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 >
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
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; } }
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模块
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 > <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 > <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 >
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 nacos: discovery: server-addr: localhost:8848
1 2 3 4 5 6 7 8 9 10 @Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate () { return new RestTemplate(); } }
1 2 3 4 5 6 @FeignClient("nacos-provider") public interface GoodsFeign { @GetMapping(value = "/goods/findById/{id}") public String findById (@PathVariable Integer id) ; }
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; @GetMapping(value = "/add/{id}") public String add (@PathVariable Integer id) { String result = restTemplate.getForObject("http://nacos-provider/goods/findById/" +id, String.class); return result; } @GetMapping(value = "/add2/{id}") public String add2 (@PathVariable Integer id) { return goodsFeign.findById(id); } }
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); } }
配置中心搭建
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 > <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 >
1 2 3 4 5 spring: profiles: active: prod
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 config: server-addr: localhost:8848 file-extension: yaml group: BJ_GROUP namespace: 14c5a736-9f4c-42b9-aed1-22dcf5386d61
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; } }
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是存到临时的文件夹目录中的,所以需要持久化,持久化到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
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"
修改成这个样子,但是如果你虚拟机分配的内存够用也不用修改,我的分配的不够,电脑配置有点拉
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即可完成
正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……