微服务网关:Nacos 源码实践(二)

2021-04-19 10:57:40 浏览数 (1)

一 概述

Nacos 实践中,简单介绍了 Nacos 源码的基本结构和 nacos-example 的三个示例。事实上,单单在引入 nacos 的 git 源码这里,就存在一个问题,我们将在本文中详细描述。而后,将以源码方式启动 nacos 控制台并访问主页面,作为对 Nacos 探究的第一步。

二 源码引入时存在的问题

2.1 问题描述

笔者使用的 ide 是 Idea,下载 git 源码到本地后,在 idea 内打开后自动 import 依赖。待所有依赖加载完成后,执行 example 中的应用示例时报错,位置:

代码语言:javascript复制
com.alibaba.nacos.consistency.ConsistencyProtocol

这是 nacos-consistency 模块的一个接口,错误信息:

找不到符号: com.alibaba.nacos.consistency.entity.ReadRequest

也就是代码同步的这三个引用:

2.2 问题原因

查看 pom.xml 引入的依赖:

代码语言:javascript复制
<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 依赖下载后的编译过程:

代码语言:javascript复制
[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,需要手动创建一下数据库:

代码语言:javascript复制
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/

create database nacos_config; 创建 db 后,使用上述 sql 进行初始化。

3.2 启动配置

直接运行 Nacos.java 会报错,错误信息:

代码语言:javascript复制
java.io.IOException: java.lang.IllegalArgumentException: db.num is null

所以需要启动前配置 JVM 参数,包括 db.num 等参数信息:

代码语言:javascript复制
-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 启动成功。

0 人点赞