1.SpringCloud Alibaba入门简介
1.1 Spring Cloud Netflix项目进入维护模式
什么是维护模式?
进入维护模式意味着什么呢?
1.2 SpringCloud alibaba带来了什么?
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
官网:
2. Nacos简介
各种注册中心对比:
安装包下载地址:
nacos后台:http://localhost:8848/nacos
3.Nacos作为服务注册中心演示
3.1 基于Nacos的服务提供者
3.1.1 新建Module cloudalibaba-provider-payment9001
3.1.2 修改pom
修改父pom
<!--spring cloud alibaba 2.1.0.RELEASE-->
<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>
修改子pom
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency><dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
3.1.3 修改yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
3.1.4修改主启动类与业务类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
3.1.5 测试
http://lcoalhost:9001/payment/nacos/1
nacos服务注册中心+服务提供者9001都ok了
3.1.6新建cloudalibaba-provider-payment9002
为了下一章节演示nacos的负载均衡,参照9001新建9002。
投机取巧的方法:
指定启动参数:-Dserver.port=9003
然后在configured列表启动即可,上图apply后不会自动启动,而是在configured的列表
3.2 基于Nacos的服务消费者
3.2.1 新建Modulecloudalibaba-consumer-nacos-order83
3.2.2 改pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
为什么nacos支持负载均衡?
因为nacos集成了ribbion
3.2.3改yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://nacos-payment-provider
3.2.4 主启动与业务类
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
3.2.5 测试
nacos控制台:
http://localhost:83/consumer/payment/nacos/13
83访问9001/9002,轮询负载OK
3.2.6 各种注册中心对比
nacos全景图:
nacos与CAP
Nacos支持AP和CP模式的切换
curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
4.Nacos作为服务配置中心演示
4.1 Nacos作为配置中心-基础配置
4.1.1 新建Module cloudalibaba-config-nacos-client3377
4.1.2 改pom
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
4.1.3 改yml
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yml #指定yml格式的配置
application.yml
spring:
profiles:
active: dev
4.1.4 主启动和业务类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
@RestController
@RefreshScope
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
@RefreshScope注解:实现配置自动更新
4.2 在Nacos中添加配置信息
Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则
官网:添加链接描述
DataId
新增配置:
4.3Nacos作为配置中心-分类配置
多环境多项目管理问题:
Nacos的图形化管理界面
配置管理:
命名空间:
Namespace+Group+Data ID三者关系?为什么这么设计?
分别通过DataID、Group、Namespace来区分不同的环境
DataID命名的时候带上环境,在application.yml中指定
spring:
profiles:
#active: dev
active: dev
新建配置的时候指定group,在bootstrap.yml中指定group
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yml #指定yaml格式的配置
namespace: 9d3c51f6-c5c9-4d6f-b51e-77c2e995f693
group: TEST_GROUP
新建namespace,在bootstrap.yml中指定
个人见解:可以使用namespace来区分不同的项目,使用dataId来区分同一项目下的不同微服务,使用group来区分统一项目同一微服务的不同环境。
5.Nacos集群和持久化配置(重要)
5.1Nacos持久化配置
修改application.properties配置文件,增加数据库的配置,并且执行自带脚本,即可完成nacos的持久化配置。修改配置文件前应备份原有配置文件
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
5.2 Linux版Nacos+MySQL生产环境配置
5.2.1 官网说明
参照官网来的生产环境架构图:
预计需要,1个nginx+3个nacos注册中心+1个mysql
Nacos下载linux版本,tar.gz
5.2.2 现网搭建
1)Linux服务器上mysql数据库执行nacos脚本
2)application.properties增加数据库连接配置
3)Linux服务器上nacos的集群配置cluster.conf
梳理出3台nacos机器的不同服务端口号,复制出cluster.conf
这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
4)编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端
/mynacos/nacos/bin目录下有startup.sh
5)Nginx的配置,由它作为负载均衡器
6)截止到此处,1个Nginx+3个nacos注册中心+1个mysql
https://服务器的ip:1111/nacos/#/login,新建一个配置文件,在数据库即可查询到
微服务cloudalibaba-provider-payment9002启动注册进nacos集群,将bootstarp.yml中的server-addr改为服务器地址,启动服务将服务注册进集群。