mysql当注册中心_Nacos 注册中心

本文介绍了阿里巴巴开源项目Nacos作为注册中心的特性,包括配置服务和注册服务。Nacos支持配置热加载,服务注册通过心跳机制进行,并提供了服务发现功能。在安装启动Nacos后,通过配置MySQL持久化,创建命名空间和配置项,并在项目中进行测试,实现了配置的动态更新和服务的注册与发现。文章还提到了在使用过程中的注意事项,如配置文件后缀、namespace的使用等。
摘要由CSDN通过智能技术生成

一、Nacos

Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。Nacos是阿里开源项目,集配置和服务注册于一体,Consul注册中心同样具有注册和配置功能一体,但从使用体验上Nacos使用更加简单,容易。

官网地址:http://nacos.io/

配置中心数据模型见下图,其主要包括命名空间,组,服务三级,同一命名空间下可以有多个组,同一组下可以有多个服务。

a48525da2f72

image

配置中心支持配置热加载,任何配置更新都会被及时加载到服务中,nacos配置客户端服务以长连接方式连接到nocos配置中心,以固定频率(测试显示频率是30s,原理上是等待了29.5s后发起配置查询和对比)进行配置拉取和对比,若更新,则及时刷新内存中的配置。

注册中心包括服务注册和服务发现。

服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

服务发现的一般流程是先从注册中心获取到服务的实例列表,然后再根据自身的需求,来选择其中的部分实例或者按照一定的流量分配机制来访问不同的服务提供者。实际实现方式有客户端负载和服务端负载两种方式。nacos采用服务端负载方式,区别于客户端负载,这样能实现更多的对服务提供者的控制。

客户端负载原理图:

a48525da2f72

image

服务端负载原理图:

a48525da2f72

image

对比两种不同实现方式,服务端的负载均衡,给服务提供者更强的流量控制权,但是无法满足不同的消费者希望使用不同负载均衡策略的需求。而不同负载均衡策略的场景,确实是存在的。而客户端的负载均衡则提供了这种灵活性,并对用户扩展提供更加友好的支持。但是客户端负载均衡策略如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务提供者。

二、安装启动nacos

参考:Nacos 快速开始

git安装方式:

git clone https://github.com/alibaba/nacos.git //最新版本1.3

cd nacos/

mvn -Prelease-nacos clean install -U -Dmaven.test.skip=true //打包, 需要下载依赖包,安装过程中git下载会比较慢,耐心等待一下。

cd distribution/

sh bin/startup.sh -m standalone //居然启动失败了

cp nacos-server-1.3.0/nacos/target/nacos-server.jar . //坑1

sh bin/startup.sh -m standalone //成功了

发行包安装方式:

下载地址

下载解压,按照上述启动方式直接启动, 我采用了这种方式,nacos版本:1.1.4

配置mysql持久化

前提:已经有mysql数据库

步骤一:按照conf/nacos-mysql.sql初始化数据库

步骤二:修改application.properties如下

server.contextPath=/nacos

server.servlet.contextPath=/nacos

server.port=8848

spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true

db.user=root

db.password=${your mysql password}

步骤三:重启nacos

步骤四:看效果

登录, 默认用户密码都是nacos:http://127.0.0.1:8848/nacos/#/login

a48525da2f72

登录地址.png

a48525da2f72

配置页面.png

三、项目测试

这里使用之前项目基础上测试nacos,其中一些依赖并非本项目所必须。主要是nacos-provider,nacos-consumer,nacos-client三个项目。下面代码结构详细贴出,以便copy下来就能够正确执行,项目结构如下:

a48525da2f72

项目结构.png

3.1 nacos配置

新增nacos配置

a48525da2f72

新建命名空间.png

增加配置项

注意dataId为配置文件名称,为完整的配置文件,包括文件后缀名。这里单独制定了group为:CLARK_GROUP

a48525da2f72

新增配置项.png

a48525da2f72

配置项详细.png

3.2 parent pom.xml

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

4.0.0

cn.com.spring

clark-parent

0.0.1-SNAPSHOT

pom

clark-parent

http://maven.apache.org

central

aliyun maven

http://maven.aliyun.com/nexus/content/groups/public/

default

true

false

clark-nacos-provider

clark-nacos-consumer

clark-nacos-client

org.springframework.boot

spring-boot-starter-parent

2.0.2.RELEASE

UTF-8

UTF-8

1.8

3.4

Finchley.RELEASE

2.0.2.RELEASE

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

org.springframework.boot

spring-boot-starter-data-redis

com.alibaba.cloud

spring-cloud-alibaba-dependencies

${spring-cloud-alibaba-dependency.version}

pom

import

org.springframework.cloud

spring-cloud-starter-openfeign

2.0.2.RELEASE

com.alibaba

fastjson

1.2.56

org.apache.commons

commons-lang3

${commons.version}

commons-codec

commons-codec

1.9

com.alibaba.boot

dubbo-spring-boot-starter

0.2.0

com.caucho

hessian

4.0.7

org.redisson

redisson

3.11.5

org.redisson

redisson-spring-boot-starter

3.11.5

org.springframework.data

spring-data-redis

2.1.1.RELEASE

com.alibaba.csp

sentinel-core

1.7.1

com.alibaba.csp

sentinel-annotation-aspectj

1.7.1

com.github.shalousun

common-util

1.9.4

com.alexecollins.docker

docker-maven-plugin

2.9.3

maven-plugin

org.springframework.boot

spring-boot-maven-plugin

maven-ali

http://maven.aliyun.com/nexus/content/groups/public//

3.3 nacos-provider

pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

cn.com.spring

clark-parent

0.0.1-SNAPSHOT

clark-nacos-provider

clark-nacos-provider

http://maven.apache.org

UTF-8

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-logging

org.springframework.boot

spring-boot-starter-web

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

org.springframework.cloud

spring-cloud-starter-openfeign

org.springframework.cloud

spring-cloud-starter-netflix-hystrix

org.springframework.boot

spring-boot-starter-log4j2

junit

junit

test

clark-nacos-provider

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

UTF-8

org.springframework.boot

spring-boot-maven-plugin

repackage

org.apache.maven.plugins

maven-surefire-plugin

false

bootstrap.xml

server:

name: nacos-provider

port: 9096

spring:

application:

name: nacos-provider

cloud:

nacos:

discovery:

server-addr: 127.0.0.1:8848

config:

server-addr: 127.0.0.1:8848

namespace: ba49f568-2495-4a7b-b957-cd8e1d7077fa

group: CLARK-GROUP

file-extension: yml

#// nacos配置默认使用使用public namespace和DEFAULT_GROUP,不需要显示填写,填写则会报错。坑2

#// 配置类型支持test,yaml,properties等,如果文件是yml结尾,则需要配置file-extension: yml

feign:

hystrix:

enabled: true

hystrix:

command:

default:

execution.isolation.thread.timeoutInMilliseconds: 60000

ribbon:

ConnectTimeout: 6000

ReadTimeout: 10000

logging:

config: classpath:log4j2.xml

level:

cn.jay.repository: trace

3.4 代码测试 nacos-provider

a48525da2f72

代码结构.png

测试读取配置文件,测试热更新@RefreshScope

package cn.com.spring.clark.server.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.cloud.context.config.annotation.RefreshScope;

@RefreshScope

@ConfigurationProperties(prefix = "student")

public class StudentConfig {

private String name;

private int age;

private String sex;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

@Override

public String toString() {

return "StudentConfig{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}';

}

}

简单的服务方法

package cn.com.spring.clark.server.service.impl;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.context.config.annotation.RefreshScope;

import org.springframework.stereotype.Service;

import cn.com.spring.clark.server.service.ProviderService;

@RefreshScope

@Service

public class ProviderServiceImpl implements ProviderService {

@Value("${zookeeperStr}")

private String zookeeperStr;

@Override

public String sayHello(String name) {

// TODO Auto-generated method stub

return "hello:"+name;

}

@Override

public String getZookeeperAddr() {

// TODO Auto-generated method stub

return zookeeperStr;

}

}

服务类

package cn.com.spring.clark.server.controller;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import cn.com.spring.clark.server.config.StudentConfig;

import cn.com.spring.clark.server.service.ProviderService;

@Controller

public class ProviderController {

private static Logger logger = LoggerFactory.getLogger(ProviderController.class);

@Autowired

private ProviderService providerService;

@Autowired

private StudentConfig studentConfig;

@GetMapping("/sayhello")

@ResponseBody

public String sayHello(String name) {

logger.info(name);

return providerService.sayHello(name);

}

@GetMapping("/getstudent")

@ResponseBody

public Object getStudentConfig() {

logger.info(studentConfig.toString());

return studentConfig;

}

@GetMapping("/getzookeeper")

@ResponseBody

public String getZookeeper() {

logger.info("getZookeeper");

return this.providerService.getZookeeperAddr();

}

}

启动类

package cn.com.spring.clark;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.cloud.client.SpringCloudApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.openfeign.EnableFeignClients;

import org.springframework.scheduling.annotation.EnableScheduling;

import cn.com.spring.clark.server.config.StudentConfig;

@SpringCloudApplication

@EnableDiscoveryClient

@EnableFeignClients

@EnableScheduling

@EnableConfigurationProperties({StudentConfig.class})

public class NacosProviderApplication {

public static void main(String[] args) {

// TODO Auto-generated method stub

SpringApplication.run(NacosProviderApplication.class, args);

}

}

3.5 定义服务二方库 nacos-client

代码结构

a48525da2f72

代码结构图.png

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

cn.com.spring

clark-parent

0.0.1-SNAPSHOT

clark-nacos-client

org.springframework.cloud

spring-cloud-starter-openfeign

package cn.com.spring.clark.nacos.client;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name="nacos-provider", fallback=NacosProviderClientHystrix.class)

public interface NacosProviderClient {

/**

* 必须加@RequestParam,否则会被转换为post请求

* @param name

* @return

*/

@RequestMapping(value="/sayhello", method = {RequestMethod.GET})

public String sayHello(@RequestParam(value = "name")String name);

}

package cn.com.spring.clark.nacos.client;

import org.springframework.stereotype.Component;

@Component

public class NacosProviderClientHystrix implements NacosProviderClient {

@Override

public String sayHello(String name) {

// TODO Auto-generated method stub

return "server error";

}

}

3.6 定义服务调用nacos-consumer

a48525da2f72

代码结构.png

pom文件引入二方库包

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

cn.com.spring

clark-parent

0.0.1-SNAPSHOT

clark-nacos-consumer

clark-nacos-consumer

http://maven.apache.org

UTF-8

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-logging

org.springframework.boot

spring-boot-starter-web

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

org.springframework.boot

spring-boot-starter-log4j2

org.springframework.cloud

spring-cloud-starter-openfeign

org.springframework.cloud

spring-cloud-starter-netflix-hystrix

cn.com.spring

clark-nacos-client

${project.version}

junit

junit

test

clark-nacos-consumer

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

UTF-8

org.springframework.boot

spring-boot-maven-plugin

repackage

org.apache.maven.plugins

maven-surefire-plugin

false

bootstrap文件

server:

name: nacos-consumer

port: 9098

spring:

application:

name: nacos-consumer

cloud:

nacos:

discovery:

server-addr: 127.0.0.1:8848

config:

server-addr: 127.0.0.1:8848

namespace: ba49f568-2495-4a7b-b957-cd8e1d7077fa

group: CLARK-GROUP

file-extension: yml

feign:

hystrix:

enabled: true

hystrix:

command:

default:

execution.isolation.thread.timeoutInMilliseconds: 60000

ribbon:

ConnectTimeout: 6000

ReadTimeout: 10000

logging:

config: classpath:log4j2.xml

level:

cn.jay.repository: trace

consumer controller,调用provider的入口

package cn.com.spring.clark.nacos.controller;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import cn.com.spring.clark.nacos.client.NacosProviderClient;

@Controller

public class ClientController {

private static Logger logger = LoggerFactory.getLogger(ClientController.class);

@Autowired

private NacosProviderClient providerClient;

@GetMapping("/sayhello")

@ResponseBody

public String sayHello(String name) {

logger.info(name);

return providerClient.sayHello(name);

}

}

启动类

package cn.com.spring.clark;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.cloud.client.SpringCloudApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.openfeign.EnableFeignClients;

import org.springframework.scheduling.annotation.EnableScheduling;

import cn.com.spring.clark.nacos.config.StudentConfig;

@SpringCloudApplication

@EnableDiscoveryClient

@EnableFeignClients

@EnableScheduling

@EnableConfigurationProperties({StudentConfig.class})

public class NacosConsumertApplication {

public static void main(String[] args) {

SpringApplication.run(NacosConsumertApplication.class, args);

}

}

3.7 运行测试

3.7.1配置测试:

a48525da2f72

获取初始配置.png

a48525da2f72

更改配置项.png

a48525da2f72

系统拉取配置更新.png

a48525da2f72

再次获取配置项.png

3.7.2注册中心测试:

a48525da2f72

截屏2020-07-1116.25.30.png

a48525da2f72

截屏2020-07-1116.26.31.png

a48525da2f72

截屏2020-07-1116.26.41.png

四、踩坑及注意事项

1、多个nacos版本启动后登陆页面会报错,切换时需要清空缓存;

2、bootstrap配置时namespace并非制定的名称,而是系统生成的一串数字串

3、配置文件名称后缀和系统默认不一致时需要指定file-extension

4、配置文件名称采用

math?formula=%7Bprefix%7D-{spring.profile.active}.${file-extension},prefix:spring.application.name

5、启动时发现找不到NacosProviderClientHystrix,有两种解决办法,一是在使用二方库的项目中添加componentscan显示加载,二是让启动类处于所有包路径的顶端,也就是二方库的包路径是启动类包路径的子包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值