关于nacos:Nacos源码学习系列第1篇服务搭建之单机模式

3次阅读

共计 10740 个字符,预计需要花费 27 分钟才能阅读完成。


服务搭建咱们分成 3 个局部服务端单机部署、服务端集群部署、客户端集成别离解说

本篇学习指标:能把 Nacos 服务端 2.1.0 版本的源码以 Debug 模式运行再 IDE 中

源码下载

进入 nacos 我的项目的的 github 地址,咱们抉择版本 2.1.0(在分支抉择框外面点击 tags 上面的 2.1.0)  把我的项目代码下载到本地目录。https://github.com/alibaba/nacos

我的项目导入

   把我的项目导入 idea,在导入之前倡议把我的项目名由【nacos-2.1.0】改成【nacos1】, 因为前面咱们在搭建服务端集群的时候会同时启动多个 nacos server。

   批改 console 模块下的 application.properties 文件 找到端口配置项【server.port】如果么有找到则增加设置启动端口 (这里咱们选用 8850 默认端口是 8848)

server.port=8850

导入数据库

须要大家提前装置好数据环境,创立数据库【nacos】, 并导入执行【console】我的项目目录下 \src\main\resources\META-INF\schema.sql 数据库脚本

批改【console】我的项目下的 application.properties 文件, 增加数据库连贯配置

db.num=1 
db.url.0=jdbc:mysql:// 数据库地址: 数据库端口 /nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0= 数据库用户名
db.password.0= 数据库明码 

留神: db.num=1  这个属性不能够少

单机模式下大家还能够应用内置存储的形式启动而不依赖内部数据, 只须要在 vm 启动配置加上【-DembeddedStorage=true】留神集群模式不能用内置存储否则无奈启动

编译启动

找到 console 模块下的服务启动类【Nacos.java】

启动之前 设置 VM 参数:-Dnacos.standalone=true

而后以 debug 模式启动【Nacos.java】

此时你肯定会在控制台遇到相似上面的编译错误信息:

Error:(19, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(20, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(21, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(72, 22) java: 找不到符号
  符号:   类 ReadRequest
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(72, 5) java: 找不到符号
  符号:   类 Response
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(80, 42) java: 找不到符号
  符号:   类 ReadRequest
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(80, 23) java: 找不到符号
  符号:   类 Response
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(90, 20) java: 找不到符号
  符号:   类 WriteRequest
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(90, 5) java: 找不到符号
  符号:   类 Response
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(100, 44) java: 找不到符号
  符号:   类 WriteRequest
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
Error:(100, 23) java: 找不到符号
  符号:   类 Response
  地位: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol<T,P>
D:\code\nacos3\consistency\src\main\java\com\alibaba\nacos\consistency\RequestProcessor.java
Error:(19, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(20, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(21, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(38, 40) java: 找不到符号
  符号:   类 ReadRequest
  地位: 类 com.alibaba.nacos.consistency.RequestProcessor
Error:(38, 21) java: 找不到符号
  符号:   类 Response
  地位: 类 com.alibaba.nacos.consistency.RequestProcessor
Error:(46, 38) java: 找不到符号
  符号:   类 WriteRequest
  地位: 类 com.alibaba.nacos.consistency.RequestProcessor
Error:(46, 21) java: 找不到符号
  符号:   类 Response
  地位: 类 com.alibaba.nacos.consistency.RequestProcessor
D:\code\nacos3\consistency\src\main\java\com\alibaba\nacos\consistency\ProtoMessageUtil.java
Error:(19, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(20, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(21, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(22, 44) java: 程序包 com.alibaba.nacos.consistency.entity 不存在
Error:(85, 54) java: 找不到符号
  符号:   类 Log
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(85, 19) java: 找不到符号
  符号:   类 WriteRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(100, 52) java: 找不到符号
  符号:   类 GetRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(100, 19) java: 找不到符号
  符号:   类 ReadRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(54, 30) java: 找不到符号
  符号:   变量 ReadRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(56, 30) java: 找不到符号
  符号:   变量 WriteRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(65, 13) java: 找不到符号
  符号:   类 GetRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(65, 34) java: 找不到符号
  符号:   变量 GetRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(71, 13) java: 找不到符号
  符号:   类 Log
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(71, 23) java: 找不到符号
  符号:   变量 Log
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(86, 16) java: 找不到符号
  符号:   变量 WriteRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil
Error:(101, 16) java: 找不到符号
  符号:   变量 ReadRequest
  地位: 类 com.alibaba.nacos.consistency.ProtoMessageUtil

问题起因: 因为 nacos 2.x 应用了 grpc 作为底层通信协定,这些对象都是以 proto 文件模式定义在 proto 文件夹中,须要咱们应用 maven 插件手动编译成 java class.

别着急,针对这些编译谬误一个一个来解决,这些编译谬误都是【consistency】模块下的。右击 consistency 我的项目下的 pom.xml,抉择【Run Maven】->【New Goal】– 在【Command line】输出【protobuf:compile】命令,  点击 ok。期待几分钟后. 再次运行【Nacos.java】咱们发现还是会呈现编译谬误,但这次的编译谬误都是在【istio】我的项目下

Error:(21, 45) java: 程序包 istio.mcp.v1alpha1.ResourceOuterClass 不存在
Error:(29, 56) java: 找不到符号
  符号: 类 Resource
Error:(45, 17) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.EmptyMcpGenerator
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\model\ServiceEntryWrapper.java
Error:(19, 45) java: 程序包 istio.mcp.v1alpha1.MetadataOuterClass 不存在
Error:(20, 56) java: 程序包 istio.networking.v1alpha3.ServiceEntryOuterClass 不存在
Error:(27, 13) java: 找不到符号
  符号:   类 Metadata
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
Error:(29, 13) java: 找不到符号
  符号:   类 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
Error:(31, 32) java: 找不到符号
  符号:   类 Metadata
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
Error:(31, 51) java: 找不到符号
  符号:   类 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
Error:(36, 12) java: 找不到符号
  符号:   类 Metadata
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
Error:(40, 12) java: 找不到符号
  符号:   类 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.model.ServiceEntryWrapper
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\mcp\NacosMcpService.java
Error:(29, 26) java: 程序包 istio.mcp.v1alpha1 不存在
Error:(30, 45) java: 程序包 istio.mcp.v1alpha1.ResourceOuterClass 不存在
Error:(31, 26) java: 程序包 istio.mcp.v1alpha1 不存在
Error:(48, 56) java: 程序包 ResourceSourceGrpc 不存在
Error:(50, 53) java: 程序包 Mcp 不存在
Error:(63, 91) java: 程序包 Mcp 不存在
Error:(63, 30) java: 程序包 Mcp 不存在
Error:(104, 29) java: 程序包 Mcp 不存在
Error:(104, 87) java: 程序包 Mcp 不存在
Error:(113, 35) java: 程序包 Mcp 不存在
Error:(113, 93) java: 程序包 Mcp 不存在
Error:(182, 16) java: 程序包 Mcp 不存在
Error:(62, 5) java: 办法不会笼罩或实现超类型的办法
Error:(69, 31) java: 程序包 Mcp 不存在
Error:(71, 38) java: 程序包 Mcp 不存在
Error:(75, 35) java: 程序包 Mcp 不存在
Error:(109, 12) java: 程序包 Mcp 不存在
Error:(168, 20) java: 程序包 Mcp 不存在
Error:(170, 44) java: 程序包 Mcp 不存在
Error:(184, 22) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.NacosMcpService
Error:(184, 70) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.NacosMcpService
Error:(185, 14) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.NacosMcpService
Error:(188, 19) java: 程序包 Mcp 不存在
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\mcp\McpConnection.java
Error:(23, 26) java: 程序包 istio.mcp.v1alpha1 不存在
Error:(28, 58) java: 程序包 Mcp 不存在
Error:(30, 44) java: 程序包 Mcp 不存在
Error:(35, 25) java: 程序包 Mcp 不存在
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\mcp\ServiceEntryMcpGenerator.java
Error:(23, 26) java: 程序包 istio.mcp.v1alpha1 不存在
Error:(24, 45) java: 程序包 istio.mcp.v1alpha1.ResourceOuterClass 不存在
Error:(25, 33) java: 程序包 istio.networking.v1alpha3 不存在
Error:(35, 63) java: 找不到符号
  符号: 类 Resource
Error:(51, 17) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.ServiceEntryMcpGenerator
Error:(52, 14) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.ServiceEntryMcpGenerator
Error:(56, 31) java: 程序包 MetadataOuterClass 不存在
Error:(57, 35) java: 程序包 ServiceEntryOuterClass 不存在
Error:(61, 24) java: 找不到符号
  符号:   变量 Resource
  地位: 类 com.alibaba.nacos.istio.mcp.ServiceEntryMcpGenerator
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\util\IstioCrdUtil.java
Error:(25, 45) java: 程序包 istio.mcp.v1alpha1.MetadataOuterClass 不存在
Error:(26, 33) java: 程序包 istio.networking.v1alpha3 不存在
Error:(27, 56) java: 程序包 istio.networking.v1alpha3.ServiceEntryOuterClass 不存在
Error:(28, 57) java: 程序包 istio.networking.v1alpha3.WorkloadEntryOuterClass 不存在
Error:(60, 21) java: 程序包 ServiceEntry 不存在
Error:(62, 42) java: 程序包 ServiceEntry 不存在
Error:(61, 57) java: 程序包 ServiceEntry 不存在
Error:(60, 52) java: 找不到符号
  符号:   变量 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
Error:(105, 13) java: 找不到符号
  符号:   类 WorkloadEntry
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
Error:(105, 43) java: 找不到符号
  符号:   变量 WorkloadEntry
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
Error:(112, 34) java: 程序包 GatewayOuterClass 不存在
Error:(113, 9) java: 找不到符号
  符号:   类 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
Error:(116, 9) java: 找不到符号
  符号:   类 Metadata
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
Error:(116, 29) java: 找不到符号
  符号:   变量 Metadata
  地位: 类 com.alibaba.nacos.istio.util.IstioCrdUtil
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\xds\ServiceEntryXdsGenerator.java
Error:(23, 45) java: 程序包 istio.mcp.v1alpha1.MetadataOuterClass 不存在
Error:(24, 45) java: 程序包 istio.mcp.v1alpha1.ResourceOuterClass 不存在
Error:(25, 56) java: 程序包 istio.networking.v1alpha3.ServiceEntryOuterClass 不存在
Error:(52, 14) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.xds.ServiceEntryXdsGenerator
Error:(56, 13) java: 找不到符号
  符号:   类 Metadata
  地位: 类 com.alibaba.nacos.istio.xds.ServiceEntryXdsGenerator
Error:(57, 13) java: 找不到符号
  符号:   类 ServiceEntry
  地位: 类 com.alibaba.nacos.istio.xds.ServiceEntryXdsGenerator
Error:(61, 27) java: 找不到符号
  符号:   变量 Resource
  地位: 类 com.alibaba.nacos.istio.xds.ServiceEntryXdsGenerator
Error:(65, 14) java: 找不到符号
  符号:   类 Resource
  地位: 类 com.alibaba.nacos.istio.xds.ServiceEntryXdsGenerator
D:\code\nacos3\istio\src\main\java\com\alibaba\nacos\istio\server\IstioServer.java
Error:(72, 98) java: 对于 intercept(com.alibaba.nacos.istio.mcp.NacosMcpService,com.alibaba.nacos.istio.server.ServerInterceptor), 找不到适合的办法
    办法 io.grpc.ServerInterceptors.intercept(io.grpc.ServerServiceDefinition,io.grpc.ServerInterceptor...) 不实用
      (参数不匹配; com.alibaba.nacos.istio.mcp.NacosMcpService 无奈转换为 io.grpc.ServerServiceDefinition)
    办法 io.grpc.ServerInterceptors.intercept(io.grpc.BindableService,io.grpc.ServerInterceptor...) 不实用
      (参数不匹配; com.alibaba.nacos.istio.mcp.NacosMcpService 无奈转换为 io.grpc.BindableService)
    办法 io.grpc.ServerInterceptors.intercept(io.grpc.ServerServiceDefinition,java.util.List<? extends io.grpc.ServerInterceptor>) 不实用
      (参数不匹配; com.alibaba.nacos.istio.mcp.NacosMcpService 无奈转换为 io.grpc.ServerServiceDefinition)
    办法 io.grpc.ServerInterceptors.intercept(io.grpc.BindableService,java.util.List<? extends io.grpc.ServerInterceptor>) 不实用
      (参数不匹配; com.alibaba.nacos.istio.mcp.NacosMcpService 无奈转换为 io.grpc.BindableService)

咱们采纳上述同样的解决办法。右击【istio】我的项目下的 pom.xml,抉择 Run Maven -> New Goal – 在 Command line 输出【protobuf:compile】命令,  点击 ok。期待几分钟后. 再次运行【Nacos.java】

此时还有可能报 istio.mcp.v1alpha1 包上面的某些类找不到, 右击我的项目【istio】我的项目下的 pom.xml,抉择【Run Maven】->【New Goal】– 在 Command line 输出【source:aggregate】命令,  点击 ok。再次运行【Nacos.java】

看到控制台以下日志阐明服务启动胜利!


2022-05-21 21:20:00.391  INFO 265184 --- [acos-starting.0] c.a.n.c.l.StartingApplicationListener    : Nacos is starting...
2022-05-21 21:20:01.404  INFO 265184 --- [acos-starting.0] c.a.n.c.l.StartingApplicationListener    : Nacos is starting...
2022-05-21 21:20:01.615  INFO 265184 --- [main] c.a.n.c.l.StartingApplicationListener    : Nacos started successfully in cluster mode. use external storage

查看控制台

http://127.0.0.1:8850/nacos

登录信息 (nacos/nacos)

总结

本地单机启动 Nacos 最次要的坑集中在配置和编译谬误。配置包含单机还是集群模式 存储应用内部存储还是外部存储, 应用 maven 的 protobuf:compile 和 source:aggregate 命令把模块下的 proto 文件夹下的 proto 文件编译成 java 对象,有时候须要 clean 加命令多试几次。

上面是我本地的配置、:

应用数据库存储:

-Dnacos.home=C:/Users/86130/nacos/nacos1 -Dnacos.standalone=true  -DembeddedStorage=false 要配合属性文件中数据库的配置

或者

应用内置存储 -Dnacos.home=C:/Users/86130/nacos/nacos1 -Dnacos.standalone=true  -DembeddedStorage=true

微信公众号搜寻【奇点架构】欢送订阅

正文完
 0