说到微服务,一想到就是针对业务复杂度不断提高的应用衍生出来的框架,大多数应用场景是大型复杂的应用。那么微服务为个人开发者有什么好处呢?我认为有以下好处:

  1. 替换原先的包/库级别的代码复用和封装。
  2. 使用微服务更容易做技术选型,可以选择合适的语言去实现特定的业务逻辑。
  3. 更利于抽象业务逻辑,甚至可以通过互联网单独共享交付微服务(公共 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-demo​github.com

服务连接不上nacos集群_Rust 微服务实践: 连接 rust , nacos , spring cloud相关推荐

  1. 分布式和微服务区别_分布式、集群、微服务到底有啥区别?

    点击上方"不太厉害的程序猿",选择"置顶或者星标" 你关注的就是我关心的! 来源说明:部分信息来源于csdn 概念: 集群是个物理形态,分布式是个工作方式. 1 ...

  2. 2017微服务 mysql集群_微服务架构系列之Nacos集群搭建

    上回我们说到了<微服务架构系列之Nacos 配置核心概念>,这次我们讲讲Nacos 集群环境搭建. 集群模式跟我们平时进行扩容是一样的,可以通过 Nginx 转发到多个节点,如下图: 如果 ...

  3. Nacos 集群部署模式最佳实践

    作者 | kiritomoe 来源 | https://mp.weixin.qq.com/s/sSTY5BivxrH4wR2-dNMkzw 1 前言 Nacos 支持两种部署模式:单机模式和集群模式. ...

  4. 沙洋有几个微服务群_集群 分布式 微服务

    转自:https://blog.csdn.net/qq_37788067/article/details/79250623 概念: 集群是个物理形态,分布式是个工作方式. 1.分布式:一个业务分拆多个 ...

  5. 分布式、集群、微服务的区别

    概念: 集群是个物理形态,分布式是个工作方式. 分布式:一个业务分拆多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 1:分布式是指将不同的业务分布在不同的地方.而集群指的是将几 ...

  6. 集群、微服务与分布式

    集群: 同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事) 集群是指将多台服务器集中在一起,每台服务器都实现相同的业务,做相同的事情.如果一台死机,另一台可以起作用. 但是每台服 ...

  7. 基SkyWalking实现对k8s集群中微服务的链路追踪

    1.思路如下: 1.sykwalking的安装配置(k8s集群部署配置) 2.sykwalking-agent探针的集成到微服务项目(是打成基础镜像里,然后指定参数(configMap中配置java项 ...

  8. DockerCompose快速部署分布式应用,集群部署微服务

    一.什么是DockerCompose? 该文件是一个文本文件,通过指令定义集群中的每个容器如何运行. 二.对比Docker命令: Compose文件:以下的文件就描述了一个项目,其中包含两个容器: 一 ...

  9. 一文简述服务器架构的演变过程:集群—分布式—微服务

    一.单服务器架构 小猿公司创立初期准备搭建一个电商网站销售公司产品,因为公司创业初期用户量不大而且着急上线,在资金有限的情况下公司购买了一台服务器,将小猿团队开发的网站放到服务器上这便算是正式上线了. ...

最新文章

  1. JavaFX FileChooser文件选择器,缓存上一次打开的目录
  2. [bzoj 5332][SDOI2018]旧试题
  3. 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
  4. drf4 视图与路由组件
  5. Android 开发笔记——通过 Intent 传递类对象
  6. oracle11g数据文件路径,oracle11g trace路径和diagnostics路径的变化
  7. CCNA-第八篇-OSPF-上
  8. Linux用户:您上一次使用Windows已有多长时间了?
  9. asp.net页面回传与js调用服务端事件、PostBack的原理详解(转)
  10. VC6编辑直接采用Linux换行符,Tips: VC++篇
  11. android 环境配置 与 运行错误
  12. TexturePacker 图片打包工具讲解与使用并且批处理打多包以及资源加密
  13. 懒人也能变美,AR试妆会让你剁手到停不下来吗?
  14. Python调用执行Linux系统命令(四种方法)
  15. 王者荣耀 露娜 技巧-教学-总结
  16. 谷歌gmail注册入口_如何删除您的Gmail帐户而不删除您的Google帐户
  17. 国内最常用的坐标系大全
  18. JS中(function(){xxx})(); 这种写法是什么意思?
  19. M1芯片Mac mini外接显示器的各种问题
  20. C++数据结构之哈希表

热门文章

  1. Spring Boot Redis缓存
  2. 2019国内某知名科技公司技术资料
  3. Docker Compose学习之docker-compose.yml编写规则 及 实战案例
  4. C#设计模式之10-外观模式
  5. 常见博客网站的robots.txt
  6. python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型
  7. html css js速成_CSS速成课程
  8. 钳工下料软件_钳工。 更开心 更具生产力。 远程工作。
  9. 阶级斗争的作用_21世纪的阶级斗争
  10. mysql下载安装教程win7_win7系统安装MySQL软件的详细步骤