nacos-group / r-nacos Goto Github PK
View Code? Open in Web Editor NEWNacos server re-implemented in Rust.
Home Page: https://r-nacos.github.io/docs/
License: Apache License 2.0
Nacos server re-implemented in Rust.
Home Page: https://r-nacos.github.io/docs/
License: Apache License 2.0
8848那个控制台没有权限控制,是否可以考虑关掉8848的控制台 或者将10848的控制台合并到8848 只保留一个控制台
项目总体上主要分下面几个大块:
计划提供java,go,rust,.net,python等不同语言的nacos使用样例,方便有需要的用户能快速使用。
样例目录: sdk-examples/$Language/[$SDK/]$ExampleName
支持按单个语言,单个sdk样例共建。
共建的同学可以在本issue留言备注自己准备补充什么sdk-example,完成之后再发起PR 。
集群部署,是必须用IP地址吗?我用域名测试一直不通过,使用docker swarm部署的,容器中可以互相通过域名ping通,集群一直连不上,提示DNS问题
新建properties 读取不到 导出也有问题,仓主可以试试
rnacos 基于actix-web实现http服务。
actix-web post请求自动构建参数 web::Form<T>
要求 http请求 header要设置Content-Type: application/x-www-form-urlencoded
。
java nacos-client 1.3.x 的 post http 请求header没有设置Content-Type: application/x-www-form-urlencoded
,导致请求处理失败。
通过将 web::Form<T>
自动构建参数对象的方式更新为从 request body 手动构建参数,兼容兼容 java nacos-client 1.3.x 。
stable 包在arm架构苹果系统运行失败,对应的报错信息: qemu-x86_64: Could not open '/lib64/ld-linux-x86_64.so.2'
。
需要调拨对应Dockerfile 以支持arm架构苹果系统。
有stable-alpine包可用,处理优先级可放低一些;放在 raft 性能优化之后处理。
我个人之前对怎么管理开源项目其实是没有经验的,在了解组织管理的更合适多人共同协作功能后,基本认同这个建议。
目前r-nacos组织已经申请下来,后继的步骤还在探索中。
等完全迁移好之后,会在新组织项目中推进项目开发工作;同时在本仓库readme 加对应说明,并对本仓库动静存档。
(没关闭本 issue 前说明没有迁移完成,还会在本仓库开发。)
Nacos-Java-Client:v1.4.1
rnacos:v0.3.7 Release解压启动
启动服务时报错:
2023-09-29 17:25:56.832 ERROR [on(8)-192.168.12.110] com.alibaba.nacos.client.naming [ 617] : [NA] failed to request
java.io.FileNotFoundException: http://localhost:8848/nacos/v1/ns/operator/metrics?app=unknown&namespaceId=public
at sun.reflect.GeneratedConstructorAccessor96.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1964)
at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1959)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1958)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1528)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1512)
at com.alibaba.nacos.common.http.client.response.JdkHttpClientResponse.getBody(JdkHttpClientResponse.java:60)
at com.alibaba.nacos.common.http.client.handler.AbstractResponseHandler.handleError(AbstractResponseHandler.java:51)
at com.alibaba.nacos.common.http.client.handler.AbstractResponseHandler.handle(AbstractResponseHandler.java:44)
at com.alibaba.nacos.common.http.client.NacosRestTemplate.execute(NacosRestTemplate.java:483)
at com.alibaba.nacos.common.http.client.NacosRestTemplate.exchangeForm(NacosRestTemplate.java:427)
at com.alibaba.nacos.client.naming.net.NamingProxy.callServer(NamingProxy.java:603)
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:526)
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:498)
at com.alibaba.nacos.client.naming.net.NamingProxy.reqApi(NamingProxy.java:493)
at com.alibaba.nacos.client.naming.net.NamingProxy.serverHealthy(NamingProxy.java:445)
at com.alibaba.nacos.client.naming.NacosNamingService.getServerStatus(NacosNamingService.java:512)
at com.alibaba.cloud.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator.doHealthCheck(NacosDiscoveryHealthIndicator.java:43)
at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:82)
at org.springframework.boot.actuate.health.HealthIndicator.getHealth(HealthIndicator.java:37)
at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:77)
at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:40)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:130)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:141)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:126)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:95)
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:66)
at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:71)
at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:74)
at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60)
at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:121)
at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:96)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at sun.reflect.GeneratedMethodAccessor136.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.FileNotFoundException: http://localhost:8848/nacos/v1/ns/operator/metrics?app=unknown&namespaceId=public
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1910)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1512)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at com.alibaba.nacos.common.http.client.response.JdkHttpClientResponse.getStatusCode(JdkHttpClientResponse.java:75)
at com.alibaba.nacos.common.http.client.handler.AbstractResponseHandler.handle(AbstractResponseHandler.java:43)
... 52 common frames omitted
2023-09-29 17:25:56.833 ERROR [on(8)-192.168.12.110] com.alibaba.nacos.client.naming [ 552] : request: /nacos/v1/ns/operator/metrics failed, servers: [localhost:8848], code: 500, msg: http://localhost:8848/nacos/v1/ns/operator/metrics?app=unknown&namespaceId=public
2023-09-29 17:25:57.215 INFO [lient.naming.updater] com.alibaba.nacos.client.naming [ 228] : new ips(1) service: DEFAULT_GROUP@@service@@DEFAULT -> [{"instanceId":"192.168.12.110#8010","ip":"192.168.12.110","port":8010,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@service","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000}]
2023-09-29 17:25:57.230 INFO [lient.naming.updater] com.alibaba.nacos.client.naming [ 267] : current ips:(1) service: DEFAULT_GROUP@@service@@DEFAULT -> [{"instanceId":"192.168.12.110#8010","ip":"192.168.12.110","port":8010,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@service","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000}]
2023-09-29 17:26:24.067 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service, group=DEFAULT_GROUP
2023-09-29 17:26:24.075 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service.yml, group=DEFAULT_GROUP
2023-09-29 17:26:24.076 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 598] : get changedGroupKeys:[service+DEFAULT_GROUP, service.yml+DEFAULT_GROUP]
2023-09-29 17:26:24.095 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.105 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service.yml, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.263 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service, group=DEFAULT_GROUP
2023-09-29 17:26:24.265 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service.yml, group=DEFAULT_GROUP
2023-09-29 17:26:24.265 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 598] : get changedGroupKeys:[service+DEFAULT_GROUP, service.yml+DEFAULT_GROUP]
2023-09-29 17:26:24.270 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.273 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service.yml, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.464 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service, group=DEFAULT_GROUP
2023-09-29 17:26:24.466 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service.yml, group=DEFAULT_GROUP
2023-09-29 17:26:24.466 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 598] : get changedGroupKeys:[service+DEFAULT_GROUP, service.yml+DEFAULT_GROUP]
2023-09-29 17:26:24.472 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.476 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 616] : [fixed-localhost_8848] [data-received] dataId=service.yml, group=DEFAULT_GROUP, tenant=null, md5=, content=, type=null
2023-09-29 17:26:24.660 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service, group=DEFAULT_GROUP
2023-09-29 17:26:24.664 INFO [fixed-localhost_8848] c.a.n.client.config.impl.ClientWorker [ 486] : [fixed-localhost_8848] [polling-resp] config changed. dataId=service.yml, group=DEFAULT_GROUP
......
后面五行就一直重复
我这边,工作中也是用 Java+Nacos 的,学了 Rust 之后一直不知道干啥。
如果大佬觉得可以的话,可以给我分配几个任务,我在工作以外的时间尽量完成,目前也是在熟悉项目的过程中。
anyway,谢谢。
想问下老师,您用rust重写nacos server的方式,是以java语言的方式编写rust来重写,还是以rust语言本身的习惯来重写的,还是其他什么方式?
扩展raft存储内容支持存储用户信息,以支持系统后继计划开启访问验证。
太牛了,我这儿刚想学学rust,你这人rnacos已经挫出来了。
太牛了,我这儿刚想学学rust,你这人rnacos已经挫出来了。
太牛了
太牛了
太牛了
太牛
牛
牛
牛
牛
结合raft kv db 实现一张支持过期失效、删除数据的缓存表,用于支持缓存功能、支持维护用户登陆时效状态。
rnacos主体逻辑是基于actix框架实现。
目前存在不少actor有相互依赖,一个actor 不是直接访问另一个 actor,通过消息传递信息,依赖关系构造维护有点复杂。
准备接入依赖注入容器,初始化时统一从容器取依赖的 actor 地址,简化有相互依赖的actor实例构造。
大佬,使用Go客户端链接的时候,报如下错误:
missing field headers
at line 1 column 110
使用SDK: nacos-sdk-go/v2 v2.2.5
优化raft集群写入机制,提升配置中心写入tps
主要思路是把raft store查询、写入异步化。 目前是使用同步方式,被io堵塞,tps上不来。目前写入 tps 在2千左右。
【优先级在控制台访问验证开发完成后】
操作系统:AlmaLinux8
我尝试了开放10848端口,可以正常访问控制台
但是我放到nginx中,怎么配置都不行,提示:
// 这个看起来302失败 ?看下面的端口7890,是内部跳转么,我看服务器没有这个端口的信息。
//开放端口时,我看应该是302到了 http://127.0.0.1:18848/p/login...... 这个url,不知道是否有什么影响
我的nginx正常配置:
location /rnacos {
proxy_pass http://127.0.0.1:18848;
}
求指导。
之前的项目名称为rnacos
这个看起来很像macos
有歧义,所以需要改名称使其更清晰。
最开始项目名想定为 racos
,不过这个名称在 crates已被占用。
新的名称暂定为 r-nacos
。
后继项目的readme与文章都会使用新的名称r-nacos
。
github中的项目地址被之前的一些文章引用,暂时不动。
我尝试将 rnacos 部署到K8S中,当pod重启后pod的ip会发生变化。
当其中的节点(pod)重启后控制台中【集群信息】中显示的IP也与实际IP不一致,重启后的从节点都各自启动为了独立的节点
[2024-01-10T07:33:29.308378Z ERROR async_raft_ext::replication] error sending AppendEntries RPC to target|LineRate| error=status: Unknown, message: "transport error: error trying to connect: tcp connect error: Connection refused (os error 111)", details: [], metadata: MetadataMap { headers: {} }
[2024-01-10T07:33:30.311986Z ERROR async_raft_ext::replication] timeout while sending AppendEntries RPC to target error=deadline has elapsed
[2024-01-10T07:33:30.815980Z ERROR async_raft_ext::replication] timeout while sending AppendEntries RPC to target error=deadline has elapsed
[2024-01-10T07:33:31.319909Z ERROR async_raft_ext::replication] timeout while sending AppendEntries RPC to target error=deadline has elapsed
建议支持css/js 缓存支持,这两个的大小非常大,速度不理想的时候很慢
是不是最新的版本还不支持鉴权操作,还有个就是有linux arm架构的包吗?
调整open api结构,之前是分散在注册、配置中心的内核模块中。
补充部分非面向sdk的openapi v1接口。
根据raft协议论文,熟悉raft 交互逻辑
rust 有几个raft库,初定在openraft和async-raft中选一个
开发
测试验收
合并代码到主干
收到用户反馈:目前控制台登录验证码比较复杂,容易输入错误。
计划简化验证码的图案复杂度,验证码内容固定为4位。
同时透出可配置控制台登录过期的配置项,让用户可自定义登录过期时间。
gateway 4.0.4 alibaba2022.0.0 nacosclient 版本2.2.3 boot版本3.1.0 cloud版本2022.0.2
网关会间隔性报错
2023-08-24 18:56:08.692 | [requestId:] | [19] | ERROR com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient 86 getServices | get service name from nacos server failed. com.alibaba.nacos.api.exception.NacosException: ServiceListRequest RequestHandler Not Found
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:662) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:623) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:357) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.getServiceList(NamingGrpcClientProxy.java:283) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.getServiceList(NamingClientProxyDelegate.java:162) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:452) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:440) ~[nacos-client-2.2.3.jar:?]
at com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery.getServices(NacosServiceDiscovery.java:70) ~[spring-cloud-starter-alibaba-nacos-discovery-2022.0.0.0.jar:2022.0.0.0]
at com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient.getServices(NacosDiscoveryClient.java:80) ~[spring-cloud-starter-alibaba-nacos-discovery-2022.0.0.0.jar:2022.0.0.0]
at org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient.getServices(CompositeDiscoveryClient.java:67) ~[spring-cloud-commons-4.0.2.jar:4.0.2]
at org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator.health(DiscoveryClientHealthIndicator.java:73) ~[spring-cloud-commons-4.0.2.jar:4.0.2]
at org.springframework.boot.actuate.health.HealthIndicator.getHealth(HealthIndicator.java:37) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:82) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpoint.getHealth(HealthEndpoint.java:41) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getLoggedHealth(HealthEndpointSupport.java:172) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:145) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:156) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:141) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getAggregateContribution(HealthEndpointSupport.java:156) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getContribution(HealthEndpointSupport.java:141) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:110) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpointSupport.getHealth(HealthEndpointSupport.java:81) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:76) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:66) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-6.0.9.jar:6.0.9]
at io.github.vino42.endpoint.EndPointAspect.judgeIfSafeRequestToActuator(EndPointAspect.java:77) ~[lll-metadata-1.0-SNAPSHOT.jar:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:702) ~[spring-aop-6.0.9.jar:6.0.9]
at org.springframework.boot.actuate.health.HealthEndpoint$$SpringCGLIB$$0.health() ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281) ~[spring-core-6.0.9.jar:6.0.9]
at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:74) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:124) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at org.springframework.boot.actuate.endpoint.jmx.EndpointMBean.invoke(EndpointMBean.java:97) ~[spring-boot-actuator-3.1.0.jar:3.1.0]
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) ~[?:?]
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) ~[?:?]
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) ~[?:?]
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) ~[?:?]
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1405) ~[?:?]
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) ~[?:?]
at jdk.internal.reflect.GeneratedMethodAccessor68.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) ~[?:?]
at sun.rmi.transport.Transport$1.run(Transport.java:200) ~[?:?]
at sun.rmi.transport.Transport$1.run(Transport.java:197) ~[?:?]
at java.security.AccessController.doPrivileged(AccessController.java:712) [?:?]
at sun.rmi.transport.Transport.serviceCall(Transport.java:196) ~[?:?]
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) ~[?:?]
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) ~[?:?]
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) ~[?:?]
at java.security.AccessController.doPrivileged(AccessController.java:399) [?:?]
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
at java.lang.Thread.run(Thread.java:833) [?:?]
登记模板:
例子1:
例子2:
你好,看到这个项目之后非常兴奋。
这也是我一直打算去做的事情。很高兴发现您已经实现了👍。
我有个疑问要请教,rnacos 中使用了 raft 协议来处理存储方面的功能。
但是我没有看到有类似 etcd snapshot 的方案来压缩数据。
请问当前有处理数据压缩的功能方案么? 或者有后续计划么
控制台用户管理中限制删除最后一个管理员,避免误操作。
这是一个用户提的建议,建个 issue 记录下。
这个优化的优先级排在 raft 性能优化之后。
收到用户反馈控制台加载大js文件耗时过长。
计划在控制台前端资源请求支持开启gzip以提升页面首屏加载速度。
暂时只在独立端口号的新控制台增加 gzip 支持。
老的控制台与nacos http 接口使用同一个端口号,全局开启gzip会影响应用使用性能。
使用类distro 协议实现集群信息的同步,不追求和java版的distro协议完全兼容。
主要逻辑:
开发功能项列表:
TODO:
您好,请问r-nacos的配置页面是否支持json/yaml高亮等功能?以及备注能力。
r-nacos开源后有持续收到用户反馈关于控制台功能优化的需求。为了后续更好的支持这方面功能,我们决定对控制台做一次优化与重构。
这部分的优先级比较高,后续的部分功能对其有依赖,计划最晚在2024-04-20前完成整体调整。
hello, 偶然发现一个nacos的rust实现,下载看了下,很轻巧,页面也很友好,正在研究能否替换内部项目的nacos,发现一些问题,还请作者看看
http POST http://127.0.0.1:8848/nacos/v1/auth/login username=nacos password=nacos
token值为mock_token,不知道是否有意为之,还是还未实现到这步,看源码是写死的
http GET http://127.0.0.1:8848/nacos/v1/console/namespaces
返回值data属性字段是对不上的,如namespaceShowName-->namespaceName,这就导致目前原有代码无法直接兼容r-nacos
不知道是否可做兼容
docker打包应用目前是musl包,计划支持使用gnu包提升运行性能
目前r-nacos已通过raft协议在集群支持用户、缓存信息储存(r-nacos可当做是一个分布式数据库),后面可以开始支持用户登录鉴权。
延伸:
问题修复方案:
因为我们项目使用的nacos版本是2.2.1,目前遇到以下一些问题:
1、nacos 2.2.1 auth的url为:/nacos/v1/auth/users/login,以前的是(/nacos/v1/auth/login)
2、rpc调用query的问题,因为项目本地开发使用dev环境,nacos在查询不到配置的时候会默认查询dev后缀的配置,如:data-id为gateway.yml查询不到就会去查询gateway-dev.yml,但前提是返回的error_code为300,nacos相关源代码:
// ~/.m2/repository/com/alibaba/nacos/nacos-client/2.2.1/nacos-client-2.2.1-sources.jar!/com/alibaba/nacos/client/config/impl/ClientWorker.java#queryConfig
if (response.isSuccess()) {
// ...
return configResponse;
} else if (response.getErrorCode() == ConfigQueryResponse.CONFIG_NOT_FOUND) {
// ConfigQueryResponse.CONFIG_NOT_FOUND = 300,尝试重新查询dev环境
LocalConfigInfoProcessor.saveSnapshot(this.getName(), dataId, group, tenant, null);
LocalEncryptedDataKeyProcessor.saveEncryptDataKeySnapshot(agent.getName(), dataId, group, tenant, null);
return configResponse;
}
3、我在修改了以上两处bug后又遇到configChange不为空导致无限查询的问题,问题代码在于这里:
// ~/.m2/repository/com/alibaba/nacos/nacos-client/2.2.1/nacos-client-2.2.1-sources.jar!/com/alibaba/nacos/client/config/impl/ClientWorker.java#executeConfigListen
public void executeConfigListen() {
// ...
RpcClient rpcClient = ensureRpcClient(taskId);
ConfigChangeBatchListenResponse configChangeBatchListenResponse = (ConfigChangeBatchListenResponse) requestProxy(rpcClient, configChangeListenRequest);
if (configChangeBatchListenResponse.isSuccess()) {
Set<String> changeKeys = new HashSet<>();
//handle changed keys,notify listener
// 问题出在这儿,当配置改变的时候,changedConfigs才不为空,但是面前rnacos的rpc是查询到有该配置就返回,所以造成了bug
if (!CollectionUtils.isEmpty(configChangeBatchListenResponse.getChangedConfigs())) {
// ...
}
}
目前我通过注释config_change_batch_listen.rs里面直接返回空值修复改bug,后续肯定是要加上缓存机制完善代码的。
如题:我在修改RNACOS_HTTP_CONSOLE_PORT 为 127.0.0.1:10848 时,发现不支持监听本地。
我想将r-nacos的独立控制台端口监听本地,然后通过Nginx套个自签名来访问。
docker 启动
nacos-client:1.4.6
心跳返回restResult.getData()是个对象,直接(String)restResult.getData();报错
10:48:19.536 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming:476 [] - HTTP method: PUT, url: http://xxxxxx:8850/nacos/v1/ns/instance/beat?app=api-service&serviceName=dev%40%40api-service&namespaceId=public&port=7066&clusterName=DEFAULT&ip=xxxxxx, body: {beat={"port":7066,"ip":"xxxxxxx","weight":1.0,"serviceName":"dev@@API-Service","cluster":"DEFAULT","metadata":{"preserved.register.source":"SPRING_CLOUD"},"scheduled":false,"period":5000,"stopped":false}}
10:48:19.566 [com.alibaba.nacos.naming.beat.sender] ERROR com.alibaba.nacos.client.naming:201 [] - [CLIENT-BEAT] failed to send beat: {"port":7066,"ip":"xxxxxxx","weight":1.0,"serviceName":"dev@@API-Service","cluster":"DEFAULT","metadata":{"preserved.register.source":"SPRING_CLOUD"},"scheduled":false,"period":5000,"stopped":false}, unknown exception msg: errCode: 101, errMsg: Nacos deserialize failed.
com.alibaba.nacos.api.exception.runtime.NacosDeserializationException: errCode: 101, errMsg: Nacos deserialize failed.
at com.alibaba.nacos.common.utils.JacksonUtils.toObj(JacksonUtils.java:227)
at com.alibaba.nacos.client.naming.net.NamingProxy.sendBeat(NamingProxy.java:443)
at com.alibaba.nacos.client.naming.beat.BeatReactor$BeatTask.run(BeatReactor.java:166)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'ok': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (String)"ok"; line: 1, column: 3]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2391)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:745)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2961)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:2002)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:802)
at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4703)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3076)
at com.alibaba.nacos.common.utils.JacksonUtils.toObj(JacksonUtils.java:225)
... 10 common frames omitted
TODOs:
能把软件发布到Homebrew么,这样更新,安装和启动都方便
有优化的地方也可以一同发现和升级 ~
relate nacos-group/nacos-sdk-rust#208
支持提供prometheus metrics数据,以方便对配置、注册中心运行情况增加监控
目前r-nacos的控制台使用绝对路径,依赖的路径是/
,如果需要新建一个独立二级域名给它使用,不然会和已有的服务相互干扰。
方案:把控制台前后端的路径都放到/rnacos/
下,支持以二级目录做转发。
关联需求 #42
目前日志打印中的时间默认是0时区,不支持参数调整。
计划改造以支持通过配置指定时区,默认按系统时区打印日志时间。
这个改造放在控制台页面重构后。
目前在控制台导入配置,是直接调用本节点的配置导入,非主节点时导入失败。
修复方式:通过config_route
导入配置,如果是从节点会自动路由到对应主节点导入。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.