微服务网关:Nacos 源码实践
系列文章:
微服务架构:网关概念与 zuul微服务网关:Spring Cloud Gateway —— Zuul
微服务网关:Spring Cloud Config- 配置中心
微服务网关方案:Kong & Nacos
Nacos 实践
一 概述
Nacos 实践中,简单介绍了 Nacos 源码的基本结构和 nacos-example 的三个示例。事实上,单单在引入 nacos 的 git 源码这里,就存在一个问题,我们将在本文中详细描述。而后,将以源码方式启动 nacos 控制台并访问主页面,作为对 Nacos 探究的第一步。
二 源码引入时存在的问题
2.1 问题描述
笔者使用的 ide 是 Idea,下载 git 源码到本地后,在 idea 内打开后自动 import 依赖。待所有依赖加载完成后,执行 example 中的应用示例时报错,位置:
com.alibaba.nacos.consistency.ConsistencyProtocol
这是 nacos-consistency 模块的一个接口,错误信息:
找不到符号:com.alibaba.nacos.consistency.entity.ReadRequest
也就是代码同步的这三个引用:
2.2 问题原因
查看 pom.xml 引入的依赖:
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>nacos-common</artifactId>
</dependency>
<dependency>
<groupId>org.javatuples</groupId>
<artifactId>javatuples</artifactId>
</dependency>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
并无报错信息,依赖页成功引入,那么为什么还会有包找不到的问题?
搜索之后,在 nacos 源码:https://gitee.com/mirrors/Nacos/的评论中找到答案:
2.3 解决方法
根据上面的提示,找到 Nacos 文档的FAQ,解决方案如下:
找不到符号`com.alibaba.nacos.consistency.entity`
这个包目录是由protobuf
在编译时自动生成,您可以通过mvn compile
来自动生成他们。如果您使用的是 IDEA,也可以使用 IDEA 的 protobuf 插件。
在 idea 中,我们在 nacos-consistency 的 lifecycle 下执行 compile 即可(也可以在命令行中执行 mvn compile,这是官方提供的解决方法),已确认生效。
2.4 compile 过程简述
从下面的构建日志,可以看到 protobuf 依赖下载后的编译过程:
[INFO] Compiling 2 proto file(s) to /Users/flamingskys/develop/mine/framework/nacos/consistency/target/generated-sources/protobuf/java
[INFO]
[INFO] --- protobuf-maven-plugin:0.5.0:compile-custom (default) @ nacos-consistency ---
Downloading from central: https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-java/1.24.0/protoc-gen-grpc-java-1.24.0-osx-x86_64.exe
Downloaded from central: https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-java/1.24.0/protoc-gen-grpc-java-1.24.0-osx-x86_64.exe (5.1 MB at 113 kB/s)
[INFO] Compiling 2 proto file(s) to /Users/flamingskys/develop/mine/framework/nacos/consistency/target/generated-sources/protobuf/grpc-java
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ nacos-consistency ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 2 resources
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ nacos-consistency ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 35 source files to /Users/flamingskys/develop/mine/framework/nacos/consistency/target/classes
[INFO] /Users/flamingskys/develop/mine/framework/nacos/consistency/src/main/java/com/alibaba/nacos/consistency/Serializer.java: 某些输入文件使用了未经检查或不安全的操作。
[INFO] /Users/flamingskys/develop/mine/framework/nacos/consistency/src/main/java/com/alibaba/nacos/consistency/Serializer.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
构建结果在 target 下,ReadRequest 内容示例:
三 Nacos 控制台源码启动
3.1 创建数据库
nacos 控制台启动,需要依赖 mysql 环境。初始化语句在 config 模块,resources/META-INF/nacos-db.sql,需要手动创建一下数据库:
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
create database nacos_config; 创建 db 后,使用上述 sql 进行初始化。
3.2 启动配置
直接运行 Nacos.java 会报错,错误信息:
java.io.IOException: java.lang.IllegalArgumentException: db.num is null
所以需要启动前配置 JVM 参数,包括 db.num 等参数信息:
-Dnacos.standalone=true
-DuseAddressServer=false
-Ddb.num=1
-Ddb.url=jdbc:mysql://localhost:3306/nacos_config
-Ddb.user=nacos
-Ddb.password=nacos
此时,通过 http://localhost:8848/nacos/index.html#/login 访问,即可看到下面页面:
用户名密码为: nacos nacos,submit后进入主页:
至此,nacos 启动成功。