服务搭建我们分成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
Error:(72, 5) java: 找不到符号
符号: 类 Response
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(80, 42) java: 找不到符号
符号: 类 ReadRequest
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(80, 23) java: 找不到符号
符号: 类 Response
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(90, 20) java: 找不到符号
符号: 类 WriteRequest
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(90, 5) java: 找不到符号
符号: 类 Response
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(100, 44) java: 找不到符号
符号: 类 WriteRequest
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
Error:(100, 23) java: 找不到符号
符号: 类 Response
位置: 接口 com.alibaba.nacos.consistency.ConsistencyProtocol
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
查看控制台
登录信息(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
微信公众号搜索【奇点架构】欢迎订阅