Mysql数据初始化

SpringCloud Alibaba第十二章,升级篇,服务注册与配置中心Nacos

一、为什么SpringCloud Alibaba

1、为什么

有了spring cloud这个微服务的框架,为什么又要使用spring cloud alibaba这个框架了?最重要的原因在于spring 

cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装,同时也新增了一些其他框架。然而

Netflix的服务发现组件Eureka已经停止更新,同时Feign、Hystrix、Zuul等也都出于升级或停更进入维护阶段。

所以急需其他的一些替代产品,也就是spring cloud alibaba。

2、SpringCloud Alibaba能做什么

1、Nacos
阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

2、Sentinel
阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

3、RocketMQ
Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。

4、Dubbo
Apache Dubbo™ 是一款高性能 Java RPC 框架。

5、Seata
阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

6、Alibaba Cloud OSS
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储
服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

7、Alibaba Cloud SchedulerX
阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。

8、Alibaba Cloud SMS
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

3、官网和资料

https://github.com/alibaba/spring-cloud-alibaba

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

4、引用

cloud_2020项目总POM中引用:

<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> 

二、服务注册与配置中心Nacos

Nacos:Dynamic Naming + Configuration Service

Nacos就是注册中心+配置中心的组合 == 等价于Eureka+Config+Bus

官网:

https://nacos.io/zh-cn/

https://nacos.io/zh-cn/docs/quick-start.html

1、Nacos下载与安装(Server)

这里的nacos即 注册中心Server

下载地址:
https://github.com/alibaba/nacos/releases/tag/1.2.1

运行:
解压后bin目录下的start

浏览:
http://localhost:8848/nacos/#/login
	账号:nacos  密码:nacos

2、服务注册中心案例(client)

2.1、服务提供者provider-payment-9001

这里nacos,即注册中心client

新建module,cloudalibaba-provider-payment-9001

<parent>
    <artifactId>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9001</artifactId> 

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>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9001</artifactId> <dependencies> <!--nacos discovery服务发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.lee.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- web组件 --> <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.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project> 

application.yml

server:
  port: 9001

spring:
  application: name: nacos-payment-provider #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #nacos server地址 management: endpoints: web: exposure: include: '*' 

主启动类

@SpringBootApplication
@EnableDiscoveryClient //服务发现
public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } } 

业务类PaymentController(读取配置信息)

@RestController
@RequestMapping("/payment")
public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: "+ serverPort+"\t id"+id; } } 

测试:

1、启动nacos server 和 cloudalibaba-provider-payment-9001
2、访问:
http://localhost:9001/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
3、访问:
http://localhost:8848/nacos



2.2、服务提供者provider-payment-9002

为了后面测试方便,仿照cloudalibaba-provider-payment-9001创建9002

<parent>
    <artifactId>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9002</artifactId> 

application.yml

server:
  port: 9002

spring:
  application: name: nacos-payment-provider #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #nacos server地址 management: endpoints: web: exposure: include: '*' 

2.3、服务消费者consumer-order-83

新建module,cloudalibaba-consumer-order-83

<parent>
    <artifactId>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-order-83</artifactId> 

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>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-order-83</artifactId> <dependencies> <!-- nacos服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.lee.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- web组件 --> <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.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project> 

application.yml

server:
  port: 83


spring:
  application: name: nacos-order-consumer #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #nacos server地址 

主启动类

@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class OrderMain83 { public static void main(String[] args) { SpringApplication.run(OrderMain83.class,args); } } 

配置类

/**
 * 配置类
 */
@Configuration
public class ApplicationContextConfig {


    //标注此注解后,RestTemplate就具有了客户端负载均衡能力---因为使用了注册中心
    //必须添加此注解,否则java.net.UnknownHostException: NACOS-PAYMENT-PROVIDER
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

业务类

@RestController
@RequestMapping("/consumer")
public class OrderController { public static final String serverURL = "http://nacos-payment-provider"; @Resource private RestTemplate restTemplate; @GetMapping(value = "/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } } 

测试:

1、启动nacos-server、cloud-provider-payment-9001、cloud-provider-payment-9002、
cloud-consumer-order-83

2、访问:http://localhost:83/consumer/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
和G
nacos registry, serverPort: 9002 id1
轮询访问

3、访问 http://localhost:8848/nacos

结论:nacos内部整合了Ribbon

2.4、各注册中心比较

2.5、Nacos的AP和CP模式切换

CAP:C数据一致性、A可用写、P分区容错性

Nacos默认是AP模式,如下进行切换:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

何时选择何种模式:

AP模式:
如果不需要存储服务级别的信息,且服务实例是通过nacos-client注册,并能够保持心跳上报,那么选择AP模式。
当前的主流服务如springcloud和dubbo都适用AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持
注册临时实例。

CP模式:
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用CP模式。
CP模式支持注册持久化实例,此时则是以raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则返回错误。


3、服务配置中心案例(client)

3.1、基础案例

创建cloudalibaba-provider-payment-9003

<parent>
    <artifactId>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9003</artifactId> 

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>cloud_2020</artifactId> <groupId>com.lee.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment-9003</artifactId> <dependencies> <!-- nacos配置中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- nacos服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.lee.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- web组件 --> <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.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project> 

application.yml

server:
  port: 9003

spring:
  profiles: active: dev 

bootstrap.yml

spring:
  application:
    name: nacos-payment-provider #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置 

主启动类

@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class PaymentMain9003 { public static void main(String[] args) { SpringApplication.run(PaymentMain9003.class,args); } } 

业务类

@RestController
@RefreshScope //实现配置的自动更新
public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } } 

3.2、Nacos添加对应配置信息

3.2.1、data id配置规则

${prefix}-${spring.profile.active}.${file-extentsion}

prefix:
	默认值为:spring.application.name,也可以通过spring.cloud.nacos.config.prefix来配置

spring.profile.active:
	spring.profile.active不存在时,对应的连接符也将不存在。
	对应的data id拼接格式为:
	${prefix}.${file-extension}

file-extension:
	为配置内容的数据格式,可以通过spring.cloud.nacos.config.file-extension来配置。
	目前只支持properties和yaml类型

3.2.2、实操

根据cloudalibaba-provider-payment-9003的bootstrap.yml和application.yml两个配置文件的配置内容,配置如下:

nacos-payment-provider-dev.yaml

配置内容:

config: 
    info: "config info from nacos config center, nacos-payment-provider-dev.yaml,version:1"

3.3、测试

1、启动nacos-server、cloudalibaba-provider-payment-9003

2、浏览:http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:1

3、在nacos-server中修改配置文件version为2

4、浏览http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:2

结论:
	nacos自带动态刷新功能

3.4、分类配置

一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又会产生多个运行环境:开发环境、测试环境、正式环境等。

那么怎么对这些微服务配置进行管理呢?

nacos通过namespace+groupID+dataId三者对不同开发环境、不同微服务进行管理

namespace:划分部署环境DEV\TEST\PROD等,默认PUBLIC
group:划分微服务项目,如 order user cms等,默认DEFAULT_GROUP
dataID如上面的命名规则

相关配置:

spring:
  application:
    name: nacos-payment-provider #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置 namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID group: CMS #nacos对应的group 

namespace配置:

group配置:

测试:

1、启动nacos-server和cloudalibaba-provider-payment-9003

2、访问:http://localhost:9003/config/info
结果:
namespace:DEV, Group:CMS, Data ID:nacos-payment-provider-dev.yaml. version:1

结论:
9003通过namespace + group + data ID三者定位配置文件的位置,从而读取配置文件

4、Nacos集群及持久化配置

这里我们只用1个Nginx服务器,3个Nacos, 1个Mysql, 3个Linux

4.1、Nacos集群安装及持久化切换

1、准备3台Linux虚拟机,它们的IP分别是192.168.0.111 -  192.168.0.107  -  192.168.0.112

2、3台服务器上各自下载nacos
wget   https://nacos的下载路径(在nacos.io官网上找)

3、在nacos的conf目录根据cluster.conf.example夫指出cluster.conf文件
cp cluster.conf.example cluster.conf

4、编辑cluster.conf文件内容
vi cluster.conf
############文件内容如下--将3台nacos的服务器地址copy上去即可--将原有内容都删除##########
192.168.0.111:8848
192.168.0.107:8848
192.168.0.112:8848

5、持久化nacos,修改conf目录下application.properties文件,将nacos的持久化数据库从内嵌的Derby切换成本地的MySQL数据库
vi application.properties
#######在文件底部添加如下--192.168.0.102是我本地windows的IP地址,即MySQL在我windows本地#######

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.0.102:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=admin123


6、关闭linux防火墙
systemctl stop firewalld
##查看防火墙状态https://www.cnblogs.com/10top/
systemctl status firewalld

4.2、Mysql数据初始化

【我的mysql在windows本地上192.168.0.102,为了能让nacos和本地mysql连接,关闭本地的防火墙,开启mysql远程访问权限】
从nacos解压包的conf目录下找到nacos-mysql.sql文件

CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

use nacos_config;

将nacos-mysql.sql的文件内容运行一下OK

##本地mysql设置可以远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'admin123' WITH GRANT OPTION;
select user,host from user;https://www.cnblogs.com/gppzjl/

##关闭本地防火墙

4.3、Nginx配置

我的nginx服务安装在了192.168.0.107上,使用upstream。

nginx需要集成nginx_upstream_check_module模块,具体安装方法请看:
https://blog.csdn.net/weixin_30379625/article/details/87693818

4.4、修改cloudalibaba-provider-payment-9003

修改bootstrap.yml,将原来连接nacos的地址修改为NGINX的服务地址

spring:https://www.cnblogs.com/10gspz/
  application:
    name: nacos-payment-provider #服务名称 cloud: nacos: discovery: #server-addr: localhost:8848 #服务注册中心地址 server-addr: 192.168.0.107:80 #NGINX的服务地址 config: #server-addr: localhost:8848 #配置中心地址 server-addr: 192.168.0.107:80 #NGINX的服务地址 file-extension: yaml #指定yaml格式的配置 #namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID #暂时关闭 #group: CMS #nacos对应的group #暂时关闭 

4.5、测试

1、启动3个nacos服务
cd /opt/software/nacos/bin
sh startup.sh

检测
可以通过查看日志:/opt/software/nacos/logs/start.out
也可以通过访问:
http://192.168.0.111:8848/nacos
http://192.168.0.107:8848/nacos
http://192.168.0.112:8848/nacos
(注意关闭防火墙)https://www.cnblogs.com/zgpz/

2、启动NGINX服务
/usr/local/nginx-1.14.1/sbin/nginc -c /usr/local/nginx-1.14.1/conf/nginx.conf

检测
可以通过访问:
http://192.168.0.107:80/nacos
(注意关闭防火墙)

通过nginx进入nacos,创建配置文件nacos-payment-provider-dev.yaml

配置格式yaml,配置内容如下:
config: 
    info: "this is nacos cluster,version:1"

3、启动cloudalibaba-provider-payment-9003
访问:http://localhost:9003/config/info

结果:
this is nacos cluster,version:1

测试成功,nacos集群配置成功!

(在nacos集群管理可以看到各nacos的服务详情)

 

猜你喜欢

转载自www.cnblogs.com/xiaocaocaohahaha/p/12792306.html