前面已经把spring cloud相关的组件都一一学了个遍,现在有点小佩服自己…本来计划今天周末好好出去玩一圈,天气太热了,39了都,还是在办公室学习吧,进行下面的springCloud Alibaba 学习吧…不废话了赶快进入正体
1. SpringCloud Alibaba入门简介
1.1 why会出现SpringCloud alibaba?
Spring Cloud Netflix项目进入维护模式,spring blog上增加官宣
不争气啊,看到都是我们前面刚学的比较熟悉的啊,hystrix,ribbon,stream,zuul等都停更了,停更不停用,我们还可以用,学了也不要气馁,原来都是一样的,后面学习其他的微服务都简单了,后面的技术抄前面的思想,实现上更优
1.2 SpringCloud alibaba带来了什么?
是什么?
能干啥?
下载?
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
怎么玩?
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: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
https://spring.io/projects/spring-cloud-alibaba#overview
https://github.com/alibaba/spring-cloud-alibaba
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
2. Nacos简介
名字的由来:前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service
2.1 nacos安装
其实安装比较简单也
可以直接参考这个官网:https://nacos.io/zh-cn/docs/quick-start.html
jdk 使用1.8以上,maven可以有可以没有,这里就是为了我们从github上面下载源码自己进行打包生成,我们如果直接下载安装包是不需要maven环境的
下载后直接解压就可以
我是用的centos7所以就使用的这个命令 windows就不用说了,做java开发的 都明白
tar -xvf nacos-server-$version.tar.gz
startup.sh -m standalone
安装完直接访问下面的
命令运行成功后直接访问http://localhost:8848/nacos
默认的账号密码都是:nacos
非常简单,就不说了…只是今天安装的时候,服务器网络不通废了一番功夫…最后还是在自己虚拟机上玩的…
2. Nacos服务注册
2.1 基于Nacos的服务提供者
直接上代码了:
父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
<?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"><parent><artifactId>mscloud</artifactId><groupId>com.hrp.springcloudalbaba</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-provider-payment9001</artifactId><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>
</project>
yml
server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class PayMentApp9001 {public static void main(String[] args) {SpringApplication.run(PayMentApp9001.class,args);}
}
业务代码
@RestController
public class PayMentContrller {@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;}}
其他都是一样搞出来一个9002
测试观察效果:
2.2 基于Nacos的服务消费者
由于nacos直接集成了ribbon,所以就拥有了负载均衡功能
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>mscloud</artifactId><groupId>com.hrp.springcloudalbaba</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-consumer-nacos-order80</artifactId><dependencies><!--SpringCloud ailibaba 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><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></project>
yml
server:port: 80spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848service-url:nacos-user-service: http://nacos-payment-provider
主启动类:
package com.hrp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** mscloud** @Title: com.hrp* @Date: 2020/6/6 14:16* @Author: wfg* @Description:* @Version:*/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderClientApp {public static void main(String[] args) {SpringApplication.run(OrderClientApp.class);}
}
业务类:
package com.hrp.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;/*** mscloud** @Title: com.hrp.controller* @Date: 2020/6/6 14:19* @Author: wfg* @Description:* @Version:*/
@RestController
@Slf4j
public class OrderController {@Resourceprivate 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);}}
配置类
package com.hrp.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** mscloud** @Title: com.hrp.config* @Date: 2020/6/6 14:20* @Author: wfg* @Description:* @Version:*/
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
测试:
实现了负载均衡
2.3 nacos作为服务注册总结
Nacos可以在ap和cp直接进行切换:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
3 Nacos配置中心
3.1 Nacos作为配置中心-基础配置
新建model cloudalibaba-config-nacos-client3377
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>mscloud</artifactId><groupId>com.hrp.springcloudalbaba</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-config-nacos-client3377</artifactId><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></project>
添加配置依赖
<!--nacos-config--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
yml文件
bootstrap yml文件
server:port: 3344spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #服务注册中心地址config:server-addr: localhost:8848 #配置中心地址file-extension: yaml #指定yaml格式的配置#${prefix}-${spring.profile.active}.${file-extension}#${spring.application.name}-${spring.profile.active}.${file-extension}
# p r e f i x − {prefix}- prefix−{spring.profile.active}.KaTeX parse error: Expected 'EOF', got '#' at position 26: …nsion} #̲{spring.application.name}- s p r i n g . p r o f i l e . a c t i v e . {spring.profile.active}. spring.profile.active.{file-extension}
这个是重点一会再单独分析
application.yml文件
spring:profiles:active: dev
为何2个yml文件和spring cloud config 一样的道理
所以这个地方的
# p r e f i x − {prefix}- prefix−{spring.profile.active}.KaTeX parse error: Expected 'EOF', got '#' at position 26: …nsion} #̲{spring.application.name}- s p r i n g . p r o f i l e . a c t i v e . {spring.profile.active}. spring.profile.active.{file-extension}
和nacos里面配置的dataId 配置失败后是不能正确启动这个model的
主启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApp3344 {public static void main(String[] args) {SpringApplication.run(NacosConfigApp3344.class);}
}
业务代码
通过springCloud 原生注解@RefreshScope 实现配置的自动更新
@RestController
@RefreshScope
public class ConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}
3.1.1 在Nacos中添加配置信息
如图添加一个文件,但是dataId 是如何命名的那
先看官网说法:
配置文件内容:
注意: config: 后面又一个空格,以及 info的缩进 这个地方一定注意不然启动的时候找不到
对应controller里面的@Value
3.2 Nacos作为配置中心-分类配置
在bootstrap.yml文件修改:
这个地方namespace 和group 配置和 在nacos页面中配置的一样进行就可以
这些地方我就配置了一个dev 和test 这个地方不做过多的配置的,主要是理解了就可以
4 Nacos集群和持久化配置(重要)
集群是开发中比较少用,但是生产环境中不可或缺的,官网:
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
修改成自己画的图:
到这里我们不妨停下来想想,上面我们在nacos配置中心配置的信息 会存到哪?
内存? 缓存? 内置数据库? 至少我们没有配置自己的数据库?
如果是内存,缓存的话,我们重启不就废了,难得配置每次都要填写?那运维会哭的…刚才我重启了下nacos 进去发现还是有的我们的配置…看样子是有内置的数据库,这样可以解决单机版的问题的…但是我们要做集群数据需要同时放在一起这就是我们需要另外配置数据库了…
Nacos默认自带的是嵌入式数据库derby
https://github.com/alibaba/nacos/blob/develop/config/pom.xml
看看官网的说法:
https://nacos.io/zh-cn/docs/deployment.html
修改成自己mysql的配置
spring.datasource.platform=mysqldb.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
derby 转到mysql 分2步:
启动nacos,可以看到是个全新的空记录界面,以前是记录进derby
重新建新的:去mysql中看看发现config_info 表中自己配置的数据
持久化到目前已经完成配置具有了集群的配置基础
4.1 集群配置
1.Linux服务器上mysql数据库配置
2.application.properties配置
这2部分不写了…java项目都是夸平台的和上面写的window版都是一样的
C:\nacos\conf\cluster.conf.example 看到这个文件,我们可以猜想,集群是和这个文件有关,不过我们打开
#it is ip
#example
10.10.109.214
11.16.128.34
11.16.128.36
看到这里 看来阿里就不知道我们这些苦逼的人都是通过不同的端口进行集群的
我们修改成这样的
这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
修改内容:window修改startup.cmd linux修改startup.sh
修改之后启动就得可以按照下面的方式了,这个地方不是很好做的,比如zookeeper rides 都是按照配置不同的端口进行启动,这个地方是阿里没考虑到的吧也是
nginx配置这里也不赘述了,原来写过相关的文档比较简单也