背景
nacos是阿里开源的一款服务注册和配置管理的中间件
在SpringCloud中注册中心和配置中心一直是分开的,之前用了很长时间的eureka,但是eureka有时会莫名其妙的挂掉,就算是集群部署线上总是提心吊胆,这
Nacos的特色
下面是官网给出说法:
-
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
-
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
应用案例
目录结构如下所示
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zew.research</groupId>
<artifactId>dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
<module>dubbo-api</module>
</modules>
<dependencies>
<!-- Dubbo dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.48.Final</version>
</dependency>
<!-- 使用Spring装配方式时可选: -->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.6</version>
</dependency>
</dependencies>
</project>
作为配置管理使用
代码结构
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zew.research</groupId>
<artifactId>nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.zew.research</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
Ctrl.java
package com.zew.research.nacos.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class Ctrl {
@Value("${demo.content:123}")
public String content;
@Value("${common.value:123}")
public String commonValue;
@GetMapping("/hello")
public ResponseEntity<String> getHello() {
return ResponseEntity.ok(commonValue+content);
}
}
启动类
package com.zew.research.nacos.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
配置
spring:
application:
name: zew-nacos-config
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
shared-configs: common.yml,common2.yml
# namespace: iss
# group: DEFAULT_GROUP
server:
port: 8082
作为注册中心与Figen结合
结构
provider模块
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zew.research</groupId>
<artifactId>nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.zew.research</groupId>
<artifactId>fegin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>provider</module>
<module>consumer</module>
</modules>
</project>
provider-client
pom xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zew.research</groupId>
<artifactId>fegin</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.zew.research</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.zew.research</groupId>
<artifactId>provider-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
</build>
</project>
ProviderClient.java
package com.zew.research.nacos.fegin.provider.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "zew-nacos-fegin-provider")
@Component
public interface ProviderClient {
@GetMapping("hello")
String sayHello();
}
provider-server
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zew.research</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.zew.research</groupId>
<artifactId>provider-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
启动类
package com.zew.research.nacos.feion.provider.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderServerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderServerApplication.class, args);
}
}
Controller
package com.zew.research.nacos.feion.provider.server;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Ctrl {
@GetMapping("/hello")
public ResponseEntity<String> sayHello(){
return ResponseEntity.ok("i am provider");
}
}
配置文件
spring:
application:
name: zew-nacos-fegin-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
consummer模块
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zew.research</groupId>
<artifactId>fegin</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.zew.research</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.zew.research</groupId>
<artifactId>provider-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
</build>
</project>
启动类
package com.zew.research.nacos.fegin.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = "com.zew.research.nacos.fegin.provider.client")
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
控制层
package com.zew.research.nacos.fegin.consumer;
import com.zew.research.nacos.fegin.provider.client.ProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Ctrl {
@Autowired
private ProviderClient providerClient;
@GetMapping
public ResponseEntity<String> sayHello() {
return ResponseEntity.ok("i am consumer,provider says: " + providerClient.sayHello());
}
}
配置文件
spring:
application:
name: zew-nacos-fegin-consummer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
server:
port: 8083
作为dubbo的注册中心
这个比较别扭,不太建议使用
结构
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zew.research</groupId>
<artifactId>dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
<module>dubbo-api</module>
</modules>
<dependencies>
<!-- Dubbo dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.48.Final</version>
</dependency>
<!-- 使用Spring装配方式时可选: -->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.6</version>
</dependency>
</dependencies>
</project>
dubbo-api
DemoServer.java
package com.zew.nacos.dubbo.service;
public interface DemoService {
String sayName(String name);
}
dubbo-consummer
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring-boot.version>2.0.3.RELEASE</spring-boot.version>
<nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
<netty-all.version>4.0.35.Final</netty-all.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.zew.research</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<!-- Dubbo Nacos registry dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>0.0.1</version>
</dependency>
<!-- Dubbo dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- Alibaba Spring Context extension -->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
TestNacosConsumer.java
package com.zew.nacos.dubbo.demo.consumer.ctrl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zew.nacos.dubbo.service.DemoService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author yanming
* @version 1.0.0
* @description
* @date 2019/02/21 9:46
**/
@Controller
@RequestMapping("consumer")
public class TestNacosConsumer {
@Reference(group = "test-nacos2")
DemoService demoService;
@RequestMapping(value = "test", method = RequestMethod.GET)
@ResponseBody
public String getCounsumerTest() {
return demoService.sayName("consumer");
}
}
启动类
package com.zew.nacos.dubbo.demo.consumer;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboConsumerApplication.class, args);
}
}
配置文件
nacos.config.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
##dubbo config
spring.application.name=spring-boot-nacos-consumer
dubbo.registry.address=nacos://127.0.0.1:8848
dubbo.application.name=spring-boot-nacos-consumer
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
server.port=8086
dubbo-provider
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zew.research</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring-boot.version>2.0.3.RELEASE</spring-boot.version>
<nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
<netty-all.version>4.0.35.Final</netty-all.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.zew.research</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<!-- Dubbo Nacos registry dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>0.0.1</version>
</dependency>
<!-- Dubbo dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- Alibaba Spring Context extension -->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
package com.zew.nacos.dubbo.provider.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import com.zew.nacos.dubbo.service.DemoService;
import org.springframework.beans.factory.annotation.Value;
/**
* Default {@link DemoService}
*
* @since 2.6.5
*/
@Service(group = "test-nacos2", retries = 0, timeout = 10000)
public class DefaultService implements DemoService {
// @Value("${hello}")
// private String str;
public String sayName(String name) {
RpcContext rpcContext = RpcContext.getContext();
return String.format("Service [name :%s , port : %d] %s(\"%s\") : Hello,%s",
"hello",
rpcContext.getLocalPort(),
rpcContext.getMethodName(),
name,
name);
}
}
package com.zew.nacos.dubbo.provider;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDubboProviderApplication.class, args);
}
}
配置文件
···
nacos.config.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
##dubbo config
spring.application.name=test
dubbo.registry.address=nacos://127.0.0.1:8848
dubbo.application.name=spring-boot-nacos-provider
dubbo.scan.basePackages=com.zew.nacos.dubbo.provider.impl
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
server.port=8085
···
个人感受
- 注册中心与配置中心结合很有想法
- 将最有难度的数据持久化交给mysql感觉有点取巧
- 单独一个nacos就能实现配置自动更新比较方便,相比之前需要多个Spring Config+Spring Bus中间件才能实现同样功能
- 跟dubbo整合更为方便
参考
参考了不少的网上资料,这里就不一一列出来了
来源:oschina
链接:https://my.oschina.net/u/4359458/blog/3234676