22-07-24 西安 SpringCloud(03) Nacos注册中心和配置中心、CAP和Base

诡异的实验现象:在你不对实验中的光束做任何观测的时候,光是以波的形式存在的;但当你开始观测光的运动轨迹时,光又变成了粒子形态。

换句话说,你的这个观测行为本身,竟然影响了客观事物!            -------《双缝干涉实验》


Spring Cloud Netflix项目进入维护模式,将模块置于维护模式,意味着SpringCloud团队将不会再向模块添加新功能。

进入维护模式意思就是目前以致以后一段时间SpringCloud netflix提供的服务和功能就这么多了,不再开发新的组件和功能了


SpringCloud alibaba

Spring Cloud Netflix-oss

随着Eureka的闭源,Spring cloud netflix-oss组件大规模的进入到了维护期,不再提供新功能,spring cloud alibaba受到开源社区的大力拥护。

Spring Cloud Alibaba

2018.10.31,Spring Cloud Alibaba正式入驻了Spring Cloud官网孵化器,并在Maven中央库发布了第一个版本。

Spring Cloud Alibaba 提供微服务开发一站式解决方案,可以用来:

  1. 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  2. 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  3. 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  4. 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  5. 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。保证数据库一致
  6. 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  7. 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。相当于计时器
  8. 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

替换Netflix那一套

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: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 


CAP原则

分布式系统设计要满足CAP原则

分布式系统定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统

CAP定理 指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。

CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

CP:在规定时间内达到数据一致性
AP:在规定时间内达到可用性(集群节点能和客户端正常通信)

数据一致性(C):指强一致性,在分布式系统中的所有数据备份,在同一时刻是否同样的值

数据一致性分为强一致性和最终一致性,强一致性指的如果数据不一致,就不对外提供数据服务,保证
用户读取的数据始终是一致的。数据强一致性只需要通过锁机制即可解决,只有当数据同步完成以后才对外提供服务。
而最终一致性要求数据最终同步即可,没有实时性要求。

可用性(A):系统提供的服务要一直处于可用状态。在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,超出时间范围 认为服务不可用

要求数据需要备份

分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。分区容错性是必须保证的

因此在进行分布式架构设计时,必须做出取舍。当前一般是通过分布式缓存中
各节点的最终一致性来提高系统的性能,通过使用多节点之间的数据异步复制技术来实现集群化的数据一致性。

而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们无法避免的。所以我们只能在一致性和可用性之间进行权衡,没有系统能同时保证这三点。要么选择CP、要么选择AP。


注册中心的区别

 Zookeeper 保证的是 CP,而 Eureka 保证的则是 AP,Nacos可以支持AP和CP的切换 

Zookeeper 保证的是 CP

Zookeeper取CAP的CP注重一致性,在可用性方面不太好,假如master节点故障,剩余节点会重新leader选举,选举leader的时间太长30~120s,选举期间整个集群都不可用,这就导致在选举期间注册服务瘫痪,漫长选举导致注册不可用,不能容忍。

Eureka 保证的则是 AP

Eureka对以上问题做了优化,所以在设计时就优先保证可用性。取CAP的AP,注重可用性。Eureka各个节点都是平等的,只要有一台Eureka还在就能保证注册服务可用(保证可用性),只不过可能查询到的不是最新的。

Nacos可以支持AP和CP的切换

Nacos从1.0版本选择Ap和CP混合形式实现注册中心,默认情况下采用Ap保证服务可用性,CP形式底层采用Raft协议保证数据的一致性问题。

如果选择为Ap模式,注册服务的实例仅支持临时模式,在网络分区的的情况允许注册服务实例。

选择CP模式可以支持注册服务的实例为持久模式,在网络分区的产生了抖动情况下不允许注册服务实例。

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

nacos官方文档: home

各注册中心比较


BASE模型

BASE是对CAP中一致性和可用性权衡的结果

其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做
到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达
到最终一致性(Eventual consistency)。

接下来看看BASE中的三要素

  1. Basically Available(基本可用

    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。 电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

  2. Soft state(软状态)

    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

  3. Eventually consistent(最终一致性

    最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

BASE模型是传统ACID模型的反面,不同于ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了


Nacos 注册中心

Nacos:Dynamic Naming and Configuration Service

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心

1、安装并启动Nacos

Nacos就是注册中心+配置中心的组合

Nacos = Eureka+Config+Bus

  • 替代Eureka做服务注册中心
  • 替代Config做服务配置中心  【放配置文件的服务器

安装运行Nacos:解压安装包(没有中文,没有空格的目录)

nacos的启动端口为8848,在启动时要保证端口不被占用,运行bin目录下的命令  

startup.cmd -m standalone

默认:MODE="cluster"集群方式启动,如果单机启动需要设置-m standalone参数,否则,启动失败。

当然也可以这样做:
修改startup.cmd文件中的第26行,改为:set MODE="standalone"以后双击启动即可

注意:要是像我这样改动了/conf/application.properties

-------------------------------------------

把nacos持久化为mysql,得先启动mysql服务

找到nacos的安装目录,打开conf目录下的nacos-mysql.sql文件,打开后可以看到是关于创建数据库,数据表的语句。

全选并复制,在Navicat或sqlyog中执行语句 我这里是Navicat(首先创建一个名字叫nacos_devtest的数据库)

之后在浏览器上访问:

http://localhost:8848/nacos

默认账号密码都是nacos,登录后的页面如下。看着挺清爽的。

从界面可知,此时没有服务注册到Nacos上。


2、Nacos依赖和配置

引入核心依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

写配置文件

   nacos默认5秒发送一次心跳
   nacos服务端认为超过三次没有发送心跳的服务宕机了(15秒)

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #配置Nacos地址

在上述的配置的中,程序的启动端口为9001,应用名为nacos-payment-provider,向nacos server注册的地址为127.0.0.1:8848。


3、@EnableDiscoveryClient

启动类或配置类加上注解@EnableDiscoveryClient,实现服务发现。

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

在controller层写一个控制器方法【服务调用时,会用到】

@RestController
public class PaymentController {
    @GetMapping(value = "provider/payment/get/{id}")
    public String getPaymentById(@PathVariable("id") Long id) {
        return "根据id:" + id + ",查询订单成功";
    }
}

启动该工程,看看nacos的变化


4、服务消费者

创建Nacos服务消费者工程。

核心依赖也是

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

---------------------------------------------------------------------

写配置文件

 消费者访问的是哪个微服务名称,而不是具体的地址,为负载均衡准备 

server:
  port: 83

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

主启动

有使用2种方式消费服务,一种是RestTemplate,一种是FeignClient,下面继续讲


5、RestTemplate

在启动类或者配置类中注入RestTemplate,创建配置类如下:

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

RestTemplate提供了多种便捷访问远程Http服务的方法

  • restTemplate.getForObject()完成查询
@RestController
@Slf4j
public class OrderNacosController {
    
    private String serverURL = "http://nacos-payment-provider";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/get/{id}")
    public String getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/provider/payment/get/" + id, String.class);
    }
}

待工程启动成功之后,可以发现nacos-payment-provider和nacos-order-consumer,均已经向nacos-server注册

在浏览器上访问,1是订单id

http://localhost:83/consumer/payment/get/1

可以在浏览器上展示正确的响应,这时nacos-order-consumer调用nacos-payment-provider服务成功。


注册中心(扩展)

1、DiscoveryClient

引入单元测试

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

 DiscoveryClient 代表的就是:服务发现操作对象。

服务消费者调用微服务之前,需要向服务注册中心,获取注册服务列表及服务信息。
这个过程就是“服务发现”。

它有两个核心方法:

  • getServices获取在服务注册中心,注册的所有服务的id。比如:ASERVICE-RBAC、ASERVICE-SMS。
  • getInstances根据服务id,获取该服务的所有启动实例的注册信息。即:一个微服务的多个副本的注册信息。
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class DiscoveryClientTest {
    @Resource
    private DiscoveryClient discoveryClient;  // 进行nacos的发现服务

    @Test
    void discoveryClientTest() {
        //获取服务Id
        List<String> services = discoveryClient.getServices();
        services.forEach(System.out::println);
        //获取每个服务的多个启动实例的注册信息。
        for (String service : services) {
            discoveryClient.getInstances(service)
                    .forEach(s -> {
                        System.out.println("InstanceId=" + s.getHost() + ":" + s.getPort());
                        System.out.println("Host:Port=" + s.getHost() + ":" + s.getPort());
                        System.out.println("Uri=" + s.getUri());
                        System.out.println("InstanceId=" + s.getInstanceId());
                        System.out.println("Schema=" + s.getScheme());
                        System.out.println("ServiceId=" + s.getServiceId());
                        System.out.println("Metadata=" + s.getMetadata());
                    });
        }

    }

}

控制台打印如下:


2、FeignClient

在消费者工程nacos-order-consumer的pom文件引入以下的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

在启动类加上@EnableFeignClients注解开启FeignClient的功能。

写一个FeignClient,调用nacos-payment-provider的服务,代码如下:

//name指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
@FeignClient("nacos-payment-provider")
public interface ProviderClient {

    @GetMapping(value = "provider/payment/get/{id}")
    public String getPaymentById(@PathVariable("id") Long id);

}

使用ProviderClient来调用nacos-provider的API服务,代码如下

@RestController
@Slf4j
public class OrderNacosController {

    @Autowired
    ProviderClient providerClient;

    @GetMapping("/consumer/payment/get/{id}")
    public String getPayment(@PathVariable("id") Long id) {
        return providerClient.getPaymentById(id);
    }
}

 在浏览器上访问,2是订单id

http://localhost:83/consumer/payment/get/2

可以在浏览器上展示正确的响应,这时nacos-order-consumer调用nacos-payment-provider服务成功。


3、Nacos的负载均衡

@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);
    }
}

1

# 端口号
server:
  port: 13201

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者【可选】,注意:nacos-payment-provider含有IP和端口)
service-url:
  nacos-user-service: http://nacos-payment-provider
#feign日志级别配置
logging:
  level: #feign日志以什么级别监控哪个接口
    com.atguigu.FeignService: debug

ribbon:
  ReadTimeout:  4000 # 读取(处理业务的时间)
  ConnectTimeout: 4000  # 连接(连接提供者端的时间)
  • 服务注册的方式,在服务启动的时候主动向服务注册中心注册服务信息
  • 服务消费者可以以负载均衡的方式,远程调用服务提供者提供的服务。

copy出来一个端口为9002工程

完工测试轮询负载均衡

 我们去访问消费端  http://localhost:83/consumer/payment/nacos/1


Nacos配置管理

1、bootstrap.yml

bootstrap.yml 和application.yml 都可以用来配置参数。

bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootstrap.yml 被加载,则内容不会被覆盖

属性覆盖

启动上下文时,Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context 的父上下文。

初始化的时候,Bootstrap Context 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment。Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖

也就是说如果加载的 application.yml 的内容标签与 bootstrap 的标签一致,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。


2、依赖和配置

基于nacos-payment-provider工程上改造

1、核心依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<!--nacos-config 配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

2、配置拉取

Nacos在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

创建配置文件 bootstrap.yml

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置(yml和yaml都可以)

在上面的配置中,配置了nacos config server的地址,配置的扩展名是yaml

--------------------------------

登陆localhost:8848/nacos,创建一个data id ,上面的配置对应如下dataId:

testname: nacos-payment-provider
config:
    info: 已经汗流浃背了

点击确定...


3、读取配置并测试

1、读取nacos配置中心的配置

@Value("${config.info}") ,对应远端的配置文件nacos-payment-provider.yaml

@RestController
public class PaymentController {

    @Value("${testname}")
    private String testName;

    //使用原生注解@Value()导入配置
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("getTestName")
    public String getTestName() {
        return testName;
    }

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

    @GetMapping(value = "provider/payment/get/{id}")
    public String getPaymentById(@PathVariable("id") Long id) {
        return "根据id:" + id + ",查询订单成功";
    }
}

2、启动项目,在浏览器输入测试

​http://127.0.0.1:9001/config/info​

。。。。我很无语,居然一直无法启动。

Could not resolve placeholder 'testname' in value "${testname}"

静态变量注入

private static String KEY;

public static long TTL;

//记得去掉static
@Value("${jwt.config.key}")
public void setKey(String key) {
    KEY = key;
}

@Value("${jwt.config.ttl}")
public void setTtl(long ttl) {
    TTL = ttl;
}

4、dataId匹配规则

Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则

bootstrap.yml中,完整版如下

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        prefix: nacos-payment-provider
  profiles:
    active: dev

在Nacos Spring Cloud中,dataId的完整格式如下:

服务名-激活的文件-文件扩展名

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

故此时,就再对应dataId : nacos-payment-provider-dev.yaml


5、@RefreshScope热加载

@RefreshScope, 动态获取配置中心的配置文件内容(热加载)

在controller层

  • @Value("${config.info}") ,对应远端的配置文件nacos-config-client-dev.yaml
@RestController
@RefreshScope   //通过SpringCould原生注解@RefreshScope实现配置自动更新
public class ConfigClientController{
    @Value("${config.info}") //对应nacos配置:nacos-config-client-dev.yaml
    private String configInfo;

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

在nacos控制台修改nacos-config-client-dev.yaml的内容

刷新页面,发现直接就拿到了,正是controller上这个注解的功劳@RefreshScope, 动态获取配置中心的配置 文件内容


6、Nacos 多环境配置

Nacos 分类配置(开发环境、测试环境、生产环境)

 默认情况:Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

Namespace主要用来实现隔离 

比组更大的分类。---命名空间(里面有很对个组)

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

namespace:id

Group默认是DEFAULT_GROUP

Group可以把不同的微服务划分到同一个分组里面去。Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。

通过spring.profile.active属性就能进行多环境下配置文件的读取


7、配置共享

pearl-common.yml,用于存放共有配置信息,

  1. bootstrap.yml添加共享配置信息

支持多个共享 Data Id 的配置,优先级小于extension-configs,自定义 Data Id 配置 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh

        shared-configs[0]:
          data-id: pearl-common.yml # 配置文件名-Data Id
          group: PEARL_GROUP   # 默认为DEFAULT_GROUP
          refresh: false   # 是否动态刷新,默认为false

其他

服务注册IP

一台机器可能存在多个网卡也就同时存在多个IP地址,如果我想知道我这个服务在向Nacos注册的时候使用的哪一个IP该怎么获取呢?

非常简单,你可以通过这种方式获取

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
 
import javax.annotation.Resource;
 
@Configuration
public class NacosRegistrationRegister implements CommandLineRunner  {
    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;
 
    @Override
    public void run(String... args) throws Exception {
        String ip = nacosDiscoveryProperties.getIp();
        System.out.println(ip);
    }
}

也可以在任意地方注入nacos的NacosDiscoveryProperties来获取比如下面

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import org.springframework.context.annotation.Configuration;
 
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
 
@Configuration
public class NacosRegistrationRegister   {
    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;
 
    @PostConstruct
    public void init() {
        String ip = nacosDiscoveryProperties.getIp();
        System.out.println(ip);
    }
}
# 如果选择固定Ip注册可以配置
spring.cloud.nacos.discovery.ip = 10.2.11.11
spring.cloud.nacos.discovery.port = 9090

# 如果选择固定网卡配置项
spring.cloud.nacos.discovery.networkInterface = eth0

Nacos持久化

Nacos默认自带的是嵌入式数据库derby,从derby到mysql切换配置步骤

1、在最后面加上,这里连接的linux的mysql,版本是5.7的

db.num=1
db.url.0=jdbc:mysql://192.168.2.108:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false
db.user=root
db.password=123456

2、使用SQLyog连接上linux的mysql,执行sql脚本创建11个表和数据库。

当时创建的数据库多加了空格,真是看了好久看不出来。。。绝望


集群配置

生产环境配置

1个nginx+3个nacos注册中心+1个mysql

linux上配置nacos集群

为什么要做nacos的集群呢?确保高可用。

这一块很乱,因为这一块我必须吐槽老师的笔记,相当的糟糕。可能总共要15步,笔记只写出来5步,还是上下不接的那种。太他吗糟心了

我还是跟着老师的视频以及老师的帮助下搭建完了。步骤实在太多,记住不啊,说个大概吧

1、下载nacos的linux版本,并使用xftp5拖到创建好的目录下 /opt/tool/nacoscluster

2、解压缩后就是 nacos这个目录了。(并没有你看到的nacos8848,nacos8849,nacos8850)

开始一顿修改,(大概就是改了这些了,不记得那么清楚了)

1、nacos/conf/application.properties.

2、把nacos/conf/cluster.conf.example文件重命名为cluster.conf

 并修改里面的内容为

 3.修改 nacos/bin/.startup.sh,修改内存大小(在93行)

修改后的结果为,当然他喵在这里多加了个:,导致一致启动nacos出问题

再一顿复制,复制完再修改端口号

复制出来nacos8848,nacos8849,nacos8850 

nacoscluster/nacos8850/conf/application.properties中修改端口号

3、启动,查看这个日志文件看nacos有没有正常启动

cat /opt/tool/nacoscluster/nacos8848/logs/start.out

 接着把另外俩个也启动

4、 在浏览器登录任意节点查看集群

 


Nginx的配置,由它作为负载均衡器

1、vim /usr/local/nginx/conf/nginx.conf

upstream nacoscluster{ 
    server 192.168.137.150:8848;
    server 192.168.137.150:8849;
    server 192.168.137.150:8850;
}

server{               
    listen 1111;
    server_name 192.168.137.150;
    location / {
         proxy_pass http://nacoscluster;                        
    }

2、启动nginx

截止到此处,1个Nginx+3个nacos注册中心+1个mysql


测试

1、在可视化控制台public下新建一个配置

2、 修改配置文件,注意服务的注册中心地址和配置中心地址都改为了nginx的地址

 3、浏览器访问

真牛逼啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值