Alibaba 简介

SpringCloud netflix项目进入了维护模式

进入维护模式意味着,SpringCloudNetflix将不再开发新的组件

我们都知道SpringCloud版本迭代算是比较快的,因此出现了很多重大ISSU都还来不及Fix就又推出了另一个Release了。进入维护模式的意思就是目前一直以后一段事件SpringCloudNetflix提供的服务和功能就这么多了,不再开发新的组件和功能了。以后将以维护和merge分支FullRequest为主

新组建功能将以其他替代平代替的方式实现
在这里插入图片描述

1. Nacos简介

前四个字符分别为 Naming和Configuration的前两个字符,最后的s为Service

  • 是什么?

    • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平添
    • Nacos就是注册中心+配置中心的组合。等价于:Nacos = Eureka+Config+Bus
  • 能干嘛?

    • 替代Eureka做服务注册中心
    • 替代Config做服务配置中心
服务注册与发现模型CAP模型控制台管理社区活跃度
EurekaAP支持
ZookeeperCP不支持
ConsulCP支持
NacosAP支持

2. 安装Nacos

将Nacos下载下来后运行startup.cmd即可

若出现

nable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat

错误,可以将startup.cmd文件里的 set Mode 将集群cluster修改为单例standalone。

3. 与其他注册中心对比提升

在这里插入图片描述

  • Nacos支持AP和CP模式切换
    • C是所有节点在同一事件看到的数据是一致的;而A的定义是所有的请求都会收到响应

3.1 何时选择使用何种模式?

一般来说,如果不需要存储服务级别的信息且服务实例通过nacos-client注册,并能保持心跳上报,那么久可以选择API模式。

当前主流的服务如SpringCloud和Dubbo服务,都适用于API模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例

如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式

CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误

4. Nacos做注册中心使用

首先在父项目添加alibaba的管理jar包

<!--spring cloud alibaba 2021.0.4.0-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2021.0.4.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

4.1 payment 生产者

pom文件中需要nacos的jar包

<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合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>
    <!--日常通用jar包配置-->
    <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>

再者就是yaml文件

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置nacos地址

# 监控内容暴露
management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类

/*
   @EnableDiscoveryClient 打开服务注册
 */
@EnableDiscoveryClient
@SpringBootApplication
public class NacosPaymentMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(NacosPaymentMain9002.class,args);
    }
}

控制器

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos 端口"+serverPort+"——已获取内容:"+id;
    }
}

4.2 consumer 消费者

一样的pom

    <dependencies>
        <!-- 在cloud较高版本情况下,不再使用默认的Ribbon,需要另加负载均衡jar包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合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>
        <!--日常通用jar包配置-->
        <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>

yaml

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 消费者将要去访问的微服务名称
service-url:
  nacos-order-service: http://nacos-payment-provider

主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class,args);
    }
}

控制器

@RestController
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    /**
     * 消费的微服务名称
     */
    @Value("${service-url.nacos-order-service}")
    private String serverURL;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id){
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}

RestTemplate特有的config类

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced // 开启负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

4.3 运行

在运行微服务前,需要先运行nacos

在这里插入图片描述

随后打开localhost:8848/nacos页面,在 服务管理 -> 服务列表 中查看注册的微服务

在这里插入图片描述

5. Nacos做配置中心使用

pom 文件

    <dependencies>
        <!-- 在高版本的cloud中,已经移除了bootstrap,需要手动引入 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

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

配置文件需要一个bootstrap.yaml和一个application.yaml。bootstrap文件要比application文件的优先级要高

bootstrap.yaml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 作为服务注册中心地址
      config:
        server-addr: localhost:8848 # 作为配置中心地址
        file-extension: yaml

# nacos配置中心的命名规则
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

# nacos-config-client-dev.yaml

# nacos-config-client-test.yaml   ----> config.info

application.yaml

spring:
  profiles:
    active: dev # 表示开发环境

在这里插入图片描述

主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class,args);
    }
}

控制器

@RefreshScope // 支持nacos的动态刷新功能
@RestController
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

5. Nacos分类管理

Nacos默认的命名空间是public,Namespace主要用来实现隔离。

比分说我们现在有三个环境:开发、测试、生产环境,我们久可以创建三个Namespace,不通过的Namespace之间是隔离的。

Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分道同一个分组里面去

Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。

比方说为了容灾,将Service分别部署在了杭州机房和广州机房

这时就可以给杭州机房的Service起一个集群名称——HZ

给广州机房的Service起一个集群名称——GZ,还可以尽量让同一个机房的微服务互相调用,以提升性能

最后是Instance,就是微服务的实例

config:
  server-addr: localhost:8848 # 作为配置中心地址
  file-extension: yaml # 配置文件后缀名
  group: DEV_GROUP # 组名称
  namespace: 221689eb-b67a-4600-85b5-a8788bee5cc7 # 命名空间流水号

在这里插入图片描述

6. 集群和持久化配置

在这里插入图片描述

Nacos可能会存在一些数据需要持久化保存,这是不可以丢失的,所以为保证数据绝对,需要搭建集群。

Nginx作为网页中转,Nacos为部署,mysql最后用于存储,整套需要搭建在Linux系统上

##6.1 Nacos部署环境

Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。

以下文档中提及的VIP,网卡等所有网络相关概念均处于内部网络环境。

6.2 Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

6.3 环境准备

安装好 JDK,需要 1.8 及其以上版本
建议: 2核 CPU / 4G 内存 及其以上
建议: 生产环境 3 个节点 及其以上

6.3.1 单机模式下运行Nacos

6.3.1.1 Linux/Unix/Mac
$ sh startup.sh -m standalone
6.3.1.2 Windows
$ cmd startup.cmd -m standalone
6.3.1.3 单机模式支持mysql

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+

  2. 初始化mysql数据库,数据库初始化文件:mysql-schema.sql

  3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql
db.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

再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql

6.3.2 集群模式下运行Nacos

多集群模式
Nacos支持NameServer路由请求模式,通过它您可以设计一个有用的映射规则来控制请求转发到相应的集群,在映射规则中您可以按命名空间或租户等分片请求…

多网卡IP选择
当本地环境比较复杂的时候,Nacos服务在启动的时候需要选择运行时使用的IP或者网卡。Nacos从多网卡获取IP参考Spring Cloud设计,通过nacos.inetutils参数,可以指定Nacos使用的网卡和IP地址。目前支持的配置参数有:

ip-address参数可以直接设置nacos的ip
nacos.inetutils.ip-address=10.11.105.155
use-only-site-local-interfaces参数可以让nacos使用局域网ip,这个在nacos部署的机器有多网卡时很有用,可以让nacos选择局域网网卡
nacos.inetutils.use-only-site-local-interfaces=true
ignored-interfaces支持网卡数组,可以让nacos忽略多个网卡
nacos.inetutils.ignored-interfaces[0]=eth0
nacos.inetutils.ignored-interfaces[1]=eth1
preferred-networks参数可以让nacos优先选择匹配的ip,支持正则匹配和前缀匹配

7. 集群部署说明

7.1 Nacos集群模式部署

这个快速开始手册是帮忙您快速在你的电脑上,下载安装并使用Nacos,部署生产使用的集群模式。

7.1.2 集群部署架构图

因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面

http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。

http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。

http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式

deployDnsVipMode.jpg

见文章:(118条消息) Linux系统安装部署nacos集群:基于nacos2.0.3_nacos安装部署linux_北冥牧之的博客-CSDN博客

需要创建三台虚拟机

MySQL一条、nacos伪集群一台、Nginx代理服务器一台。

要求:nacos的虚拟机内存不低于4G,硬盘不低于50G

说点在Nginx虚拟机中的配置,安装好nginx后,配置文件中需要多暴露两个端口。

在nacos2.x中这是新添加的两个管理端口,如果不暴露这两个grep,服务进程就无法注入到Nacos中。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    upstream cluster{
	server 192.168.21.141:3333;
	server 192.168.21.141:4444;
	server 192.168.21.141:5555;
    }
    server {
        listen       1111;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            #index  index.html index.htm;
			proxy_pass http://cluster;
        }

        #error_page  404              /404.html;

        location = /50x.html {
            root   html;
        }
    }

}

# 在nacos 2.x 中,需要多暴露两个端口
stream {
    upstream cluster2{
	server 192.168.21.141:4333;
	server 192.168.21.141:5444;
	server 192.168.21.141:6555;
    }
    upstream cluster3{
	server 192.168.21.141:4334;
	server 192.168.21.141:5445;
	server 192.168.21.141:6556;
    }

  #由于nacos是根据端口去偏移grpc端口的。所以需要在8080的基础上偏移1000、1001
    server {
	   listen 2111 so_keepalive=on;
       tcp_nodelay on;  
       proxy_pass cluster2;
   }
   server {
       listen 2112 so_keepalive=on;
          tcp_nodelay on;  
          proxy_pass cluster3;
   }
}

在Mysql虚拟机上,只需要创建好Nacos的数据库就好了,然后经由nacos连接

🥸🏏SpringCloud微服务专栏

  1. 【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
  2. 【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
  3. 【SpringCloud(3)】Ribbon负载均衡:IRule原理轮询算法;LB负载均衡;loadbalancer和IRule组件;Ribbon和Ngin负载均衡的区别
  4. 【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
  5. 【SpringCloud(5)】Hystrix断路器:服务雪崩概念;服务降级、服务熔断和服务限流概念;使用Hystrix完成服务降级与服务熔断
  6. 【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置
  7. 【SpringCloud(7)】SpringCloud Config分布式配置中心;服务端与客户端配置;SpringCloud Bus总线;bus刷新全局广播
  8. 【SpringCloud(8)】SpringCloud Stream消息驱动;Stream思想;生产者、消费者搭建
  9. 【SpringCloud(9)】SpringCloud Sleuth链路追踪;核心概念-跟踪、跨度;ZipKin集成

💕👉博客专栏

更多推荐