服务连接不上nacos集群_Rust 微服务实践: 连接 rust , nacos , spring cloud
说到微服务,一想到就是针对业务复杂度不断提高的应用衍生出来的框架,大多数应用场景是大型复杂的应用。那么微服务为个人开发者有什么好处呢?我认为有以下好处:
- 替换原先的包/库级别的代码复用和封装。
- 使用微服务更容易做技术选型,可以选择合适的语言去实现特定的业务逻辑。
- 更利于抽象业务逻辑,甚至可以通过互联网单独共享交付微服务(公共 api 服务)。
最近正在入门 rust,所以拿点将来重构的微服务小项目练手.
服务发现选型: 阿里的 nacos (https://nacos.io/),作为 spring 生态中唯一的国人产品,很不错的选择,对比用 spring cloud 来说,nacos 集成了服务发现,配置管理,同时又是直接单独部署,支持集群,是简化基础不错的选择。
消费者:使用 spring cloud ,毕竟用的人最多,同时和 nacos 集成良好,省事,可以专注在此rust 的折腾上。
nacos 和 spring cloud 已经成熟,集成不表,参考 nacos 文档
nacos 单点启动,参考 https://nacos.io/zh-cn/docs/quick-start.html
spring clound 集成参考 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
这里详细说明一下 rust 方面的经历
技术选型:
使用 actix-web 框架,这个框架目前在 rust 圈子中人气也很高。 rust 和 node 或者 golang 领域的web 框架很类似 所有很容易上手,简单的代码:
#[derive(Serialize, Deserialize)]
struct Message {msg: String,code: i32,
}async fn index() -> impl Responder {HttpResponse::Ok().body("this is a rust microservice demo")
}async fn plain_text_resp() -> impl Responder {HttpResponse::Ok().body("from /foo")
}async fn json_resp() -> impl Responder {let p = Message {msg: "from /bar".to_string(),code: 0,};HttpResponse::Ok().json(p)
}#[actix_rt::main]
async fn main() {println!("listening at http://localhost:8080");//nacos::register_service();HttpServer::new(|| {App::new().route("/", web::get().to(index)).route("/foo", web::get().to(plain_text_resp)).route("/bar",web::get().to(json_resp))}).bind("127.0.0.1:8080").unwrap().run();//nacos::ping_schedule();}
目前还没有现成的 nacos rust 库,所以需要根据 nacos 的 api https://nacos.io/zh-cn/docs/open-api.html 自己实现,这里只做了 服务器注册,和心跳机制的功能,使用 reqwest 库作为 http 请求的实现。
use crate::NACOS_SERVER;
use crate::PROVIDER_HOST;
use crate::PROVIDER_NAME;
use crate::PROVIDER_PORT;
use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS};
use std::time::Duration;
use async_std::task;const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'{').add(b'}').add(b':').add(b',');
///
/// https://nacos.io/
/// http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=rust-microservice&ip=127.0.0.1&port=8080
pub fn register_service() {println!("register service: {:?}", NACOS_SERVER);task::spawn(async {let client = reqwest::blocking::Client::new();let body = client.post(format!("{}/v1/ns/instance?serviceName={}&ip={}&port={}",NACOS_SERVER,PROVIDER_NAME,PROVIDER_HOST,PROVIDER_PORT).as_str()).send().unwrap().text();println!("{:?}", body);});
}
fn ping() {//// nacos 文档中没有说明 metadata 必选, 测试发现,如果没有 metadata 信息, java 端会有错误//let beat = format!("{{"serviceName":"{}","ip":"{}","port":"{}","weight":1,"metadata":{{}}}}", PROVIDER_NAME, PROVIDER_HOST, PROVIDER_PORT);let encode = utf8_percent_encode(&beat, FRAGMENT).to_string();task::spawn(async move {let client = reqwest::blocking::Client::new();let _body = client.put(format!("{}/v1/ns/instance/beat?serviceName={}&beat={}",NACOS_SERVER,PROVIDER_NAME,encode).as_str()).send().unwrap().text();println!("ping result:{:?}", _body);});
}pub fn ping_schedule() {println!("ping schedule");loop {ping();std::thread::sleep(Duration::from_secs(1));}
}
nacos 的文档不够完善,过程中走了一点点弯路,就是心跳机制 api 中 beat json 对象的格式在文档中没有说明,参考了 nacos java client 的代码才找到...
nacos 的库代码完成后,在主程序中调用相关的功能即可由。
nacos::register_service();
nacos::ping_schedule();
这样 rust 程序运行后, nacos 中就可以看到 rust 成功注册了,同时 java 中也可以正常调用了。java consumer 中 使用了 openfeign 和 resttemplate 两种方式的实现:
@FeignClient(name = "rust-microservice",fallback = OpenFeignRustService.FallbackService.class)
public interface OpenFeignRustService {@GetMapping("/foo")public String foo();@GetMapping("/bar")public Object bar();@Componentpublic static class FallbackService implements OpenFeignRustService{@Overridepublic String foo() {return "foo fallback";}@Overridepublic Object bar() {return new HashMap<>();}}
}@RestController
@RequestMapping("/api/feign")
public class OpenFeignController {@AutowiredOpenFeignRustService rustService;@RequestMapping("/foo")public String foo() {return rustService.foo();}@RequestMapping("/bar")public Object bar() {return rustService.bar();}
}
RestTemplate:
@RestController
@RequestMapping("/api/rest")
public class RestTemplateController {public static final String SERVICE = "rust-microservice";@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/foo")public String foo() {return restTemplate.getForObject("http://"+SERVICE+"/foo",String.class);}@RequestMapping("/bar")public Object bar() {return restTemplate.getForObject("http://"+SERVICE+"/bar",Object.class);}
}
整体还是很顺利的,只是目前对 rust 还不太熟悉,经常被编译器吊打...
后续跟进:
nacos rust sdk 的完善
rust 微服务实现一个具体的业务,包含数据处理
docker/podman 部署等等
代码仓库,欢迎讨论:
https://github.com/Liangdi/rust-microservice-demogithub.com
服务连接不上nacos集群_Rust 微服务实践: 连接 rust , nacos , spring cloud相关推荐
- 分布式和微服务区别_分布式、集群、微服务到底有啥区别?
点击上方"不太厉害的程序猿",选择"置顶或者星标" 你关注的就是我关心的! 来源说明:部分信息来源于csdn 概念: 集群是个物理形态,分布式是个工作方式. 1 ...
- 2017微服务 mysql集群_微服务架构系列之Nacos集群搭建
上回我们说到了<微服务架构系列之Nacos 配置核心概念>,这次我们讲讲Nacos 集群环境搭建. 集群模式跟我们平时进行扩容是一样的,可以通过 Nginx 转发到多个节点,如下图: 如果 ...
- Nacos 集群部署模式最佳实践
作者 | kiritomoe 来源 | https://mp.weixin.qq.com/s/sSTY5BivxrH4wR2-dNMkzw 1 前言 Nacos 支持两种部署模式:单机模式和集群模式. ...
- 沙洋有几个微服务群_集群 分布式 微服务
转自:https://blog.csdn.net/qq_37788067/article/details/79250623 概念: 集群是个物理形态,分布式是个工作方式. 1.分布式:一个业务分拆多个 ...
- 分布式、集群、微服务的区别
概念: 集群是个物理形态,分布式是个工作方式. 分布式:一个业务分拆多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 1:分布式是指将不同的业务分布在不同的地方.而集群指的是将几 ...
- 集群、微服务与分布式
集群: 同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事) 集群是指将多台服务器集中在一起,每台服务器都实现相同的业务,做相同的事情.如果一台死机,另一台可以起作用. 但是每台服 ...
- 基SkyWalking实现对k8s集群中微服务的链路追踪
1.思路如下: 1.sykwalking的安装配置(k8s集群部署配置) 2.sykwalking-agent探针的集成到微服务项目(是打成基础镜像里,然后指定参数(configMap中配置java项 ...
- DockerCompose快速部署分布式应用,集群部署微服务
一.什么是DockerCompose? 该文件是一个文本文件,通过指令定义集群中的每个容器如何运行. 二.对比Docker命令: Compose文件:以下的文件就描述了一个项目,其中包含两个容器: 一 ...
- 一文简述服务器架构的演变过程:集群—分布式—微服务
一.单服务器架构 小猿公司创立初期准备搭建一个电商网站销售公司产品,因为公司创业初期用户量不大而且着急上线,在资金有限的情况下公司购买了一台服务器,将小猿团队开发的网站放到服务器上这便算是正式上线了. ...
最新文章
- JavaFX FileChooser文件选择器,缓存上一次打开的目录
- [bzoj 5332][SDOI2018]旧试题
- 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
- drf4 视图与路由组件
- Android 开发笔记——通过 Intent 传递类对象
- oracle11g数据文件路径,oracle11g trace路径和diagnostics路径的变化
- CCNA-第八篇-OSPF-上
- Linux用户:您上一次使用Windows已有多长时间了?
- asp.net页面回传与js调用服务端事件、PostBack的原理详解(转)
- VC6编辑直接采用Linux换行符,Tips: VC++篇
- android 环境配置 与 运行错误
- TexturePacker 图片打包工具讲解与使用并且批处理打多包以及资源加密
- 懒人也能变美,AR试妆会让你剁手到停不下来吗?
- Python调用执行Linux系统命令(四种方法)
- 王者荣耀 露娜 技巧-教学-总结
- 谷歌gmail注册入口_如何删除您的Gmail帐户而不删除您的Google帐户
- 国内最常用的坐标系大全
- JS中(function(){xxx})(); 这种写法是什么意思?
- M1芯片Mac mini外接显示器的各种问题
- C++数据结构之哈希表
热门文章
- Spring Boot Redis缓存
- 2019国内某知名科技公司技术资料
- Docker Compose学习之docker-compose.yml编写规则 及 实战案例
- C#设计模式之10-外观模式
- 常见博客网站的robots.txt
- python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型
- html css js速成_CSS速成课程
- 钳工下料软件_钳工。 更开心 更具生产力。 远程工作。
- 阶级斗争的作用_21世纪的阶级斗争
- mysql下载安装教程win7_win7系统安装MySQL软件的详细步骤