Anno 让微服务、混合编程更简单(Net love Java)
在社区或者QQ群我们经常看到有人争辩编程语言的好坏,只要一提起这个话题常常就能引来很多人参与,往往最后就变成了一群人几个小时的骂战。今天我们要说的是如何让Java和.Net(甚至更多语言)相结合。充分发挥其优势扬长避短。
1、Anno是什么?
Anno是一个微服务框架引擎。入门简单、安全、稳定、高可用、全平台可监控、依赖第三方框架少。底层通讯RPC(Remote Procedure Call)采用稳定可靠经过无数成功项目验证过的跨语言的thrift、 grpc。 自带服务注册发现健康检查(不依赖于Etcd、Consul、Zookeeper)、调用链追踪、Cron 调度、限流、事件总线等等。
2、Java和.Net 混合开发
Java的生态很强大,但是他的语法也常常让人诟病。提起.Net经常有人说他不能跨平台(其实早期.net 可以借助Mono跨平台,并且在多个领域取得了不可磨灭的成绩),国内生态不好。随着.net core 的出现和前段时间.Net5的发布,让.net 跨平台更容易。并且.net 有着超高的性能、优雅的语法等等很多方面被人称赞。在编程语言百花齐放的今天,我们需要扬长避短利用不同编程语言各自的优势为我们提供更好的服务。就在这种场景下我们推出了 Anno微服务框架,让微服务、跨语言混合开发变的更简单更容易。
在Anno中调用方(Client)无需知道服务提供方(Provider)的地址、端口、开发语言等等信息,因此我们在开发过程中对于我们需要的服务我们只管通过Client SDK调用,无需关注细节。这样我们也避免了在多语言开发的微服务中带来的各种奇葩问题。
下图是一个在线体验的环境:http://140.143.207.244/

Java服务的资源监控

.Net服务的资源监控(运行时长、内存、CPU、硬盘、访问量)

我们来看一下从网关(.NET5.0实现)访问Java服务:

java端功能开发实例代码:



1 package anno.componentservice;
2
3 import anno.componentservice.Models.UserInfo;
4 import anno.componentservice.events.UserEvent;
5 import anno.configuration.AnnoTheadPool;
6 import anno.entities.SysMember;
7 import anno.repository.SysMemberMapper;
8 import anno.thrift.annotation.AnnoInfo;
9 import anno.thrift.module.ActionResult;
10 import anno.thrift.module.BaseModule;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.context.ApplicationEventPublisher;
13 import org.springframework.stereotype.Service;
14
15 import javax.annotation.Resource;
16 import java.util.HashMap;
17 @Service
18 //@Scope("prototype")
19 public class UserInfoModule extends BaseModule {
20 @Autowired
21 private ApplicationEventPublisher publisher;
22 @Autowired
23 private SysMemberMapper sysMemberMapper;
24 @AnnoInfo(desc = "用户信息")
25 public ActionResult<Object> GetUserInfo(GetUserInfoRequestDto queryInput){
26 UserInfo userinfo=new UserInfo();
27 userinfo.setAge(18);
28 userinfo.setName("Tom");
29 HashMap<String,Object> output=new HashMap<String, Object>();
30 output.put("key1","value1");
31 output.put("key2","value2");
32 for(HashMap.Entry<String,Object> kv:output.entrySet()){
33 output.put(kv.getKey(),kv.getValue());
34 }
35 HashMap<String,Object> outputData=new HashMap<String, Object>();
36 outputData.put("queryInput",queryInput);
37 outputData.put("userinfo",userinfo);
38 String msg= "this message from Java Server UserInfoModule.";
39 return new ActionResult<Object>(true, outputData, output, msg);
40 }
41 @AnnoInfo(desc = "你好世界")
42 public ActionResult<Object> HelloWorld(@AnnoInfo(desc = "名称",name = "name",required = false,defaultValue = "Anno Default Value") String anno){
43 String greetings="Hello "+anno+" I am Anno!";
44 return new ActionResult<>(true,greetings);
45 }
46 public void PublishMsg(String name){
47 if(name==null){
48 name="Anno";
49 }
50 UserEvent uv=new UserEvent();
51 uv.setId(10010);
52 uv.setName(name);
53 /**
54 * 线程池方式发布事件
55 */
56 AnnoTheadPool.getPool().execute(()->{
57 publisher.publishEvent(uv);
58 });
59 /**
60 * 发布事件异步 创建线程
61 */
62 // new Thread(()->{
63 // publisher.publishEvent(uv);
64 // }).start();
65 /**
66 * 直接发布事件 同步
67 */
68 // publisher.publishEvent(uv);
69 }
70
71 @AnnoInfo(desc = "根据ID获取用户信息")
72 public ActionResult<SysMember> GetUserAutowired(long id) {
73 SysMember member=sysMemberMapper.selectById(id);
74 return new ActionResult<>(true,member);
75 }
76 }
更多关于Java和.NET的混合开发的详情,请移步到GitHub查看
学习交流 QQ群:478399354 ,到这里我们互为师长相互学习。
Anno核心源码:https://github.com/duyanming/Anno.Core
Java实现:https://github.com/duyanming/anno.thrift-parent
Viper示例项目:https://github.com/duyanming/Viper
体验地址:http://140.143.207.244/Home/Login
文档地址:https://duyanming.github.io/
关于Anno的更多内容,随后更新。敬请关注。开源不易,感谢Star。
Anno 让微服务、混合编程更简单(Net love Java)的更多相关文章
- NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会
前言 日志,一直以来都是开发人员和运维人员最关心的问题.开发人员可通过日志记录来协助问题定位,运维人员可通过日志发现系统隐患,故障等定位问题.如果你的系统中没有日志,就像一个断了线的风筝,你永远不知道 ...
- 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单
一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...
- 转:[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单 async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...
- [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单 async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...
- 四、C# 5.0 新特性——Async和Await使异步编程更简单
一.引言 .NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就 ...
- 看完这篇微服务架构设计思想,90%的Java程序员都收藏了
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...
- (转)微服务_创建一个简单的Eureka注册中心
原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...
- Swift让编程更简单 人人都是开发者
全称为苹果全球开发者大会的WWDC,每年的这个时候,都会如这段时间前后所举行的Google I/O 和微软的BUILD开发者会议一样,吸引全球科技媒体的目光.近几年来,因为在会上爆的猛料越来越多,“开 ...
- C# 5.0 新特性——Async和Await使异步编程更简单
http://www.cnblogs.com/zhili/archive/2013/05/15/csharp5asyncandawait.html http://blog.zhaojie.me/201 ...
随机推荐
- git连接gitlab下载项目代码
1.安装git 2.鼠标右键git bash here 3.命令行界面输入生成公钥命令 ssh-keygen -t rsa -C'gitlab用户名' 然后一直按enter键下一步生成公钥即可' 4. ...
- echarts折线图,数据切换时(最近七天)绘图不合理现象
echarts折线图,当进行数据切换时存在绘制不合理的问题,数据没错,但绘制不对. 两个0之间的连线应该是平滑直线,如图: 正确的显示: 解决: 在myCharts.setOption(option) ...
- [LeetCode题解]160. 相交链表 | 双指针 + 哈希表
方法一:双指针 解题思路 假设链表存在相交时,headA 的长度为 a + c,headB 的长度为 b + c.如果把 headA 连上 headB,headB 连上 headB 的话,当遍历这两个 ...
- sqlilab less32-less37
less-32 过滤了单引号,双引号,斜杠,同时设置数据库为GBK编码,可以考虑宽字节注入, 当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字.用脚本来测试下哪些符合 ...
- ntfs和fat32的区别
ntfs和fat32是两种不同的磁盘文件系统格式,虽然他们有一定的相似点,但还是具有很大的差异.今天,小编就带大家了解一下ntfs和fat32的区别. 图1 :u盘 一.分区容量 fat32能够有效管 ...
- FLstudio 系列教程(六):如何安装FL studio
FL Studio简称FL,全称:Fruity Loops Studio,因此国人习惯叫它"水果".目前版本是FL Studio20,它让你的计算机就像是全功能的录音室,大混音盘, ...
- 【移动自动化】【四】获取Toast
什么是Toast Android中的Toast是一种简易的消息提示框. 如何识别Toast 使用 xpath 查找 推荐 //*[@class='android.widget.Toast'] (固定这 ...
- 添加mysqli扩展
find / -name phpize 进入mysqli目录下 ./configue -prefix=/usr/local/mysqli . make && make install ...
- tcp连接的三次握手
为什么tcp连接需要三次握手才能建立连接 主要是为了初始化sequence number的初始值,通信的双方要互相通知双方的sequence number,这个要作为以后数据通信的序号,保证以后不会因 ...
- 根节点到叶子节点路径之和为target
//递归吧,但是在递归到底的条件上要判断好,比如说完整路径是到叶子节点,也就是说左右子节点都为空,并且这时候的root.val==target表示找到了一个list,再返回. 但是因为我并没有直接就用 ...