阿里开源组件
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:在国内应用非常广泛的一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。
阿里商业化组件
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS:阿里云对象存储服务( OSS),是阿里云提供的云存储服务。
Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
还可以集成 Spring Cloud 组件,Zuul,OpenFeign等网关,Spring Cloud Stream 消息组件
springcloud
springcloud是若干个框架的集合,提供了服务治理,服务网关,智能路由,负载均衡,断路器,监控跟踪,分布式消息队列,配置管理等领域的解决方案。
springcloud包含一下组件,主要以Netflix开源为主:
springcloud alibaba
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。
只需添加一些注解和少量配置,就可将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能
包含的组件为
Spring Cloud Alibaba 功能
服务注册与发现
Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。
适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
支持多协议的服务调用
Spring Cloud 默认的服务调用依赖 OpenFeign 或 RestTemplate 使用 REST 进行调用。
使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。
服务限流降级
Spring Cloud Alibaba 基于 Sentinel,对 Spring 体系内基本所有的客户端,网关进行了适配,
默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入。
Sentinel应用比较简单,只需引入 starter,即可生效,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
微服务消息驱动
支持为微服务应用构建消息驱动能力,基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,
也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。
分布式事务
使用 Seata 解决微服务场景下面临的分布式事务问题。
使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题。
分布式配置管理
支持分布式系统中的外部化配置,配置更改时自动刷新。
天然支持云原生
云原生是一种专门针对云上应用而设计的方法,用于构建和部署应用,以充分发挥云计算的优势。
阿里云的商业化组件OSS,schedulerx等,开发者可以在阿里云上实现对象存储,分布式任务调度等功能。
nacos的配置
下载地址:
nacos文档地址
GitHub下载地址
启动:下载对应版本的Nacos Server,到安装目录的bin目录下执行命令,切记,一定要配好jkd的环境。Window的启动命令如下;
- startup cmd -m standalone
其中standalone代表单机模式运行,非集群模式,如果说没有配置集群,直接点击startup.cmd启动会报错
启动成功,访问http://localhost:8848/nacos
账号密码都是nacos,进入nacos控制台,安装成功。
创建Spring Boot并注册服务到nacos中
idea创建一个springboot项目。
pom文件为
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.alibaba.nacos</groupId>
<artifactId>springcloudAlibabaDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloudAlibabaDemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2.2.6.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入nacos client依赖-->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud.version}</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>
</project>
yml配置
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
group: springcloudAlibabaDemo # 应用分组默认为:DEFAULT_GROUP
application:
name: demo-center
启动项目,就注册到了nacos里面了。
构建父子项目和Nacos动态配置管理
构建父项目:
生成一个springboot项目,让其作为Maven POM,项目名:cloud-nacos-demo,作为父项目,依赖选择上spring web。pom文件打包方式改成pom:
<packaging>pom</packaging>
pom 文件如下
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nacosdemo</groupId>
<artifactId>cloud-nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-nacos-demo</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<modules>
<module>cloud-nacos-common-entity</module>
<module>cloud-nacos-common-redis</module>
<module>cloud-nacos-common-utils</module>
<module>cloud-nacos-console-center</module>
<module>cloud-nacos-customer-center</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
构建子module
重复上方在创建 SpringBoot 项目时的步骤,为Maven Project,Next 下一步,Group与Parent项目保持一致,Artifact修改为Module项目作用域名称,暂且创建以下几个模块
cloud-nacos-common-utils
cloud-nacos-common-redis
cloud-nacos-common-entity
cloud-nacos-customer-center
cloud-nacos-console-center
子module的pom文件为(以其中某一个为例):
<?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>
<parent>
<groupId>com.nacosdemo</groupId>
<artifactId>cloud-nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.nacosdemo</groupId>
<artifactId>cloud-nacos-console-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-nacos-console-center</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
验证:
打包父项目验证,如果都出现tagert就代表成功了。
在cloud-nacos-common-utils下创建TestUtil文件
package com.nacosdemo.cloudnacoscommonutils.utils;
/**
* @author s
* @date 2022-03-17 17:02
*/
public class TestUtil {
public static void test() {
System.out.println("this is cloud-nacos-common-utils TestUtil test()");
}
}
删除pom文件build标签和内容(同时也删除父项目pom的build),启动类,以及resources、test文件夹, 只保留pom和src文件夹(同时也可依法修改另外几个common工程)
cloud-nacos-console-center
引入utils依赖
<dependency>
<groupId>com.demo</groupId>
<artifactId>cloud-nacos-common-utils</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
创建TestController
/**
* @author s
* @date 2022-03-17 16:58
*/
@RestController
public class controller {
@GetMapping("/test")
public String test() {
TestUtil.test();
System.out.println("11111");
return "dudududududu";
}
}
启动项目,访问http://localhost:8080/test
统一管理依赖版本
在多模块的项目中,如果父 pom 中引入依赖,则子模块会全盘接受父 pom 中引入的依赖,即使它本身不需要这个依赖。Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。如果有多个子项目都引用同一样依赖,可避免在每个子项目里声明一个版本。
- 当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目。
- 如果某个子项目中需要另外的一个版本,只需要声明version即可。
- dependencyManagement中定义的只是依赖的声明,并不实现引入,因此子项目需要显式的声明需要用的依赖。
在父项目的POM.xml中配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
子项目则无需指定版本信息了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Cloud + Nacos
父POM文件,在父pom中添加springcloud的依赖
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nacosdemo</groupId>
<artifactId>cloud-nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-nacos-demo</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<modules>
<module>cloud-nacos-common-entity</module>
<module>cloud-nacos-common-redis</module>
<module>cloud-nacos-common-utils</module>
<module>cloud-nacos-console-center</module>
<module>cloud-nacos-customer-center</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2.2.6.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
服务注册/发现/消费
- pom
修改子模块,添加pom依赖项。在cloud-nacos-console-center、cloud-nacos-customer-center这两个子模块中。
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--引入nacos client依赖-->
<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-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
小提示:sping cloud的Netflix ribbon 和 feign的区别与选用:
Ribbon 是一个基于HTTP和TCP客户端的负载均衡器它可以在客户端配置ribbonServerList(服务端列表),然后轮询请求一实现**均衡负载****。**联合Eureka 使用ribbonServerList会被DiscoveryEnableNIWSServerList重写,从Eureka注册中心获取服务端列表同时它也会用NIWSDiscoveryPing来取代IPing,通过Eureka来确定服务端是否已经启动。使用HTTPClient或者RestTemplate模拟http请求。
Feign ** 是在Ribbon的基础上进行了一次改进,是一个使用起来更加方便的HTTP客户端。面向接口,在上面添加注解**即可,不需要自己构建http请求,然后就像是调用自身工程的方法调用。
这里选择用Feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 启动类加注解
@EnableDiscoveryClient // 开启服务注册
@EnableFeignClients // 开启feign远程调用
- yml
customer-cener 的yml文件
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
group: DEV_GROUP
application:
name: customer-center
console-center yml文件
server:
port: 8082
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
group: DEV_GROUP
application:
name: console-center
验证
启动两个模块,在nacos中的服务列表中可以看到
分别访问:http://localhost:8082/test ; http://localhost:8081/test
消费成功。
Nacos 配置管理
依赖
<!--启用配置服务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
版本兼容问题:
SpringBoot2.4.0,使用新版本的 Spring Could Config Client 时,这个版本的配置方式发生了大改动(困扰我一个上午。。)
Spring Cloud文档地址
通过查看文档发现,Spring Boot 2.4 引入了一种通过spring.config.import属性导入配置数据的新方法。在新版中将spring.cloud.bootstrap.enabled默认设置为false不启用, 若要bootstrap配置生效,加入以下依赖
<!-- bootstrap配置不生效,加入以下依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
yml
server:
port: 8081
同级新建bootstrap.yml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
group: DEV_GROUP
#register-enabled: true # 是否开启注册服务(默认true)
config: # 配置中心
server-addr: localhost:8848 # 地址
prefix: config # 默认为 spring.application.name 的值
file-extension: yml
#refresh-enabled: true # 是否开启动态刷新(默认true)
application:
name: customer-center
profiles:
active: dev
创建配置类:ConfigProperties
package com.nacosdemo.cloudnacoscustomercenter.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
* @author s
* @date 2022-03-21 11:07
*/
@RefreshScope
@Component
@Data
public class ConfigProperties {
@Value("${test:0}")
private String test;
@Value("${test1:0}")
private String test1;
@Value("${test2:0}")
private String test2;
@Value("${resource.test3:0}")
private String test3;
}
注意:@RefreshScope这个注解
修改UserController
package com.nacosdemo.cloudnacoscustomercenter.controller;
import com.nacosdemo.cloudnacoscustomercenter.config.ConfigProperties;
import com.nacosdemo.cloudnacoscustomercenter.service.ConsoleApiService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author s
* @date 2022-03-21 9:13
*/
@RestController
public class UserController {
@Resource
ConfigProperties properties;
@Resource
ConsoleApiService consoleApiService;
@GetMapping("/test")
public String getUser() {
return "test=" + properties.getTest()
+ "; test1=" + properties.getTest1()
+ "; test2=" + properties.getTest2()
+ "; test3=" + properties.getTest3()
;
}
@GetMapping("/test1")
public String getUser1() {
return consoleApiService.test();
}
}
启动
根据nacos的配置,在Nacos控制台-配置管理-配置列表-右上角的+号新增配置
Nacos配置的加载规则详解
在项目未重启时候,访问http://localhost:8081/test
修改配置文件中的内容,再次访问连接
搭建成功!撒花花~~~
根据大佬的博客顺利完成搭建,大佬原文地址如下:
原文链接:https://blog.youkuaiyun.com/qq_44695727/article/details/117998412