前言
nacos可以作为微服务的注册中心 .,也可以作为配置中心, 功能强大. 但是在生产环境中还是不要把nacos 既作为配置中心, 又当做注册中心, 因为这两个都是微服务中十分重要的模块, 如果把他们合在一起风险太大. 可以建议你部署两个nacos(集群)来分别作为注册中心和配置中心.
项目结构
最外面的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-build</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/>
</parent>
<groupId>xyz.xiezc</groupId>
<artifactId>dailyMaven</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>db-jpa</module>
</modules>
<name>dailyMaven</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- 常规jar -->
<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>
db-jpa模块的配置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>dailyMaven</artifactId>
<groupId>xyz.xiezc</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>db-jpa</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
在resource目录下增加 application.yml
配置文件:
application.yml
server:
## 端口号
port: 8001
spring:
application:
## 项目名, 很重要 后面微服务的之间的调用会根据这个来进行路由
name: db-jpa
cloud:
nacos:
discovery:
#配置nacos地址
server-addr: www.abc.com:8848
#打开全部监控端点
maagement:
endpoints:
web:
exposure:
include: '*'
增加启动类
启动类代码如下:
package com.abc.db;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
public class DbApplication {
public static void main(String[] args) {
SpringApplication.run(DbApplication.class,args);
}
@Slf4j
@RestController
static class TestController {
@GetMapping("/hello")
public String hello(@RequestParam String name) {
log.info("invoked name = " + name);
return "hello " + name;
}
}
}
接下来点击执行即可
运行结果
打开我上篇文章Docker配置的nacos 注册中心地址, 可以看到服务已经注册上去了.
接口也可以直接访问
监控也正常
总结
db-jpa 是我用来专门访问数据库的一个微服务, 这种设计有利和弊;
优点:
- 数据库可以统一管理, 屏蔽其他微服务都数据库的访问
- 切换修改数据库可以只修改者一个微服务, 不影响其他的微服务
缺点:
- 都使用微服务了, 说明系统压力大, 会导致这个服务压力过大,
- 容易出现单点故障. 这个服务挂了导致都不可访问数据库
微服务的划分有需要要考虑的地方, 没有万全的方案, 我之所以这样搞, 是因为这是我的业余项目.
这里一个最最基本的服务注册到nacos 完成了, 这个服务中我只是简单的提供一个http接口, 如果要完整的微服务需要你接入 其他的模块, 本来这个微服务我定义的是专门用来访问数据库的. 并且使用dubbo对外提供rpc调用服务, 如何接入dubbo会在后面的文章中介绍.