1.Spring Cloud Alibaba的功能:
1.流控制和服务降级:支持WebServlet,WebFlux,OpenFeign,RestTemplate,Dubbo访问限制和降级流的功能。它可以在运行时通过控制台实时修改限制和降级流的规则,并且还支持监视限制和降级度量标准。
2.服务注册和发现:可以注册服务,客户可以使用Spring托管的bean,自动集成功能区发现实例。
3.分布式配置:支持分布式系统中的外部配置,配置更改时自动刷新。
4.Rpc服务:扩展Spring Cloud客户端RestTemplate和OpenFeign以支持调用Dubbo RPC服务。
5.事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
6.分布式事务:支持高性能且易于使用的分布式事务解决方案。
7.阿里云对象存储:大规模,安全,低成本,高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
8.阿里云SchedulerX:准确,高度可靠,高可用性的计划作业调度服务,响应时间在几秒钟之内。
9.阿里云短信:阿里云短信服务覆盖全球,提供便捷,高效,智能的通信功能,帮助企业快速联系客户。
2.依赖管理
添加依赖到pom.xml 部分。这将允许您忽略任何Maven依赖项的版本,而是将版本委派给BOM。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.服务注册/ 发现
3.1 服务发现
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3使用Nacos Discovery进行服务注册/发现和呼叫的示例
Nacos Discovery与Netflix Ribbon,RestTemplate或OpenFeign集成在一起,可用于服务到服务的呼叫
3.3.1启动应用程序
pom.xml的配置
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>open.source.test</groupId>
<artifactId>nacos-discovery-test</artifactId>
<version>1.0-SNAPSHOT</version>
<name>nacos-discovery-test</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.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>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties的配置
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
如果您不想使用Nacos进行服务注册和发现,则可以设置spring.cloud.nacos.discovery为false。
启动provider程序
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
现在,您可以在Nacos控制台上查看已注册的服务
3.3.2启动消费者应用程序
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);
}
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
接下来,访问http://localhost:8081/echo/app-name使用者提供的界面。在这里,我们启动了8082端口。访问结果如下:
Address:http://127.0.0.1:8082/echo/app-name
Access result: Hello Nacos Discovery nacos-consumer
配置 | Key | 默认值 | 描述 |
---|---|---|---|
服务器地址 | spring.cloud.nacos.discovery.server-addr | Nacos监听器的IP和端口 | |
服务名称 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 命名当前服务 |
权重 | spring.cloud.nacos.discovery.weight | 1 | 值范围:1到100。值越大,重量越大 |
网卡名称 | spring.cloud.nacos.discovery.network-interface | 如果未指定IP地址,则注册的IP地址是网卡的IP地址。如果也未指定,默认情况下将使用第一个网卡的IP地址。 | |
注册IP地址 | spring.cloud.nacos.discovery.ip | 最高优先级 | |
注册端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下将自动检测。不需要配置。 |
命名空间 | spring.cloud.nacos.discovery.namespace | 一个典型的场景是隔离针对不同环境的服务注册,例如测试和生产环境之间的资源(配置,服务等)隔离 | |
快捷键 | spring.cloud.nacos.discovery.access-key | 阿里云帐户访问密钥 | |
密钥 | spring.cloud.nacos.discovery.secret-key | 阿里云账户密钥 | |
元数据 | spring.cloud.nacos.discovery.metadata | 您可以使用地图格式为服务定义一些元数据 | |
日志文件名 | spring.cloud.nacos.discovery.log-name | ||
集群名称 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos的集群名称 |
endpoint | spring.cloud.nacos.discovery.endpoint | 特定服务在特定区域中的域名。您可以使用该域名动态检索服务器地址 | |
是否集成ribbon | ribbon.nacos.enabled | true | 在大多数情况下设置为true |
启用Nacos监听 | spring.cloud.nacos.discovery.watch.enabled | true | 设置为false以关闭手表 |
4. Nacos Config
4.1 Nacos Config配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.properties.
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
取值方式:
@RefreshScope这个注解可以实现自动刷新配置,配置修改不用再次启动服务
自动刷新配置还可以用@ConfigurationProperties注解
@ConfigurationProperties(“config”) config为配置前缀
@Data
@Component
@ConfigurationProperties("config")
public class OrderProperties {
private String appKey;
}
4.2支持自定义命名空间
命名空间用于隔离不同租户的配置。在不同的命名空间中,组和数据ID可以相同。命名空间的典型场景是隔离不同环境的配置,例如,开发/测试环境与生产环境(配置和服务等)之间的隔离。
通过yml配置文件指定config
server:
port: 8000
spring:
application:
name: service-order
profiles:
active: dev
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
# 指定命名空间
namespace: dev
---
# 通过?group=order指定分组
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: dev
---
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: test
---
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: prod
4.3 Nacos Config 更多信息配置
配置 | Key | 默认值 | 描述 |
---|---|---|---|
服务器地址 | spring.cloud.nacos.config.server-addr | Nacos服务器侦听器的IP和端口 | |
Nacos配置的Dataid | spring.cloud.nacos.config.name | 首先使用前缀,然后使用名称,最后使用spring.application.name | |
编nacos配置编码 | spring.cloud.nacos.config.encode | ||
Nacos配置组 | spring.cloud.nacos.config.group | DEFAULT_GROUP | |
nacos config dataId的后缀,也是config文件扩展名。 | spring.cloud.nacos.config.fileExtension | properties | |
Nacos配置超时 | spring.cloud.nacos.config.timeout | 3000 | 从Nacos获取配置超时 |
命名空间 | spring.cloud.nacos.config.namespace | 命名空间 | |
Nacos Server的上下文路径 | spring.cloud.nacos.config.contextPath | Nacos Server的上下文路径 | |
集群名称 | spring.cloud.nacos.config.clusterName | ||
共享配置的Dataid | spring.cloud.nacos.config.sharedDataids | 共享配置的数据标识,用“,”分隔 | |
共享配置的动态刷新dataid | spring.cloud.nacos.config.refreshableDataids | 共享配置的动态刷新数据标识,用“,”分隔 | |
自定义dataid | spring.cloud.nacos.config.extConfig | 这是一个列表,由ConfigPOJO建立。Config具有3个属性dataId,group和refresh |
Nacos持久化
mysql数据库3.6.5以上
Nacos默认自带嵌入式数据库Derby
derby到mysql切换配置步骤
1./nacos/conf目录下找到sql脚本nacos-mysql.sql
2.修改conf目录下application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456