在社区或者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)的更多相关文章

  1. NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会

    前言 日志,一直以来都是开发人员和运维人员最关心的问题.开发人员可通过日志记录来协助问题定位,运维人员可通过日志发现系统隐患,故障等定位问题.如果你的系统中没有日志,就像一个断了线的风筝,你永远不知道 ...

  2. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...

  3. 转:[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

    本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...

  4. [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

    本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...

  5. 四、C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 .NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就 ...

  6. 看完这篇微服务架构设计思想,90%的Java程序员都收藏了

    本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...

  7. (转)微服务_创建一个简单的Eureka注册中心

    原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...

  8. Swift让编程更简单 人人都是开发者

    全称为苹果全球开发者大会的WWDC,每年的这个时候,都会如这段时间前后所举行的Google I/O 和微软的BUILD开发者会议一样,吸引全球科技媒体的目光.近几年来,因为在会上爆的猛料越来越多,“开 ...

  9. C# 5.0 新特性——Async和Await使异步编程更简单

    http://www.cnblogs.com/zhili/archive/2013/05/15/csharp5asyncandawait.html http://blog.zhaojie.me/201 ...

随机推荐

  1. Java POI导入word, 带图片

    1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...

  2. 【鸿蒙应用开发】使用确切位置布局(PositionLayout)实现登录页面

    上一节我们了解了PositionLayout(确切位置布局,我更倾向于称为绝对布局),虽然应用场景稀少.维护不方便,但是该有的示例还是不能少. UI图拆解及代码实现 这个界面我们是不是很熟悉,打开浏览 ...

  3. Map结合Function函数式接口的巧妙之处

    需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果: 例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和, ...

  4. vue中使用transition和animate.css动画效果

    一.单个动画中,使用div中引用animate动画 1.下载依赖 npm install animate.css –save 2.main.js中全局引用 import animate from 'a ...

  5. guitar pro系列教程(二十五):Guitar Pro教程之组织小节

    上一章节我们讲述了关于Guitar Pro 7的主界面的相关功能的介绍,对于初学作曲,又是吉他的初学者,刚刚接触Guitar Pro时,很多的功能,符号,工具都市不熟悉的,这样在创作,使用的过程中就会 ...

  6. Anno微服务引擎与传统应用相融合

    1.Anno是什么? Anno是一个微服务引擎.在此之前我们通过 Viper项目对Anno有一个基本的认识,并且Viper也受到的很多朋友的喜欢,截止发稿前Viper在GitHub收获了300多个星. ...

  7. mac下让iterm2记住远程ssh连接

    brew安装sshpass brew install http://git.io/sshpass.rb 在根目录下建立passowrd目录用来管理密码,vim testserver 输入明文密码,保存 ...

  8. java基础:CompletionStage接口

    CompletionStage是Java8新增接口,用于异步执行中的阶段处理:先看接口 可以简单划分为三类: 1.在上一阶段执行结束之后,一阶段结果作为指定函数的参数执行函数产生新的结果,apply/ ...

  9. synchronized关键字的内存语义

    以下内容摘自:Java并发编程之美 加锁和释放锁的语义:当获取锁以后会清空锁块内本地内存中将会被用到的共享变量,在使用这些共享变量的时从主内存进行加载,在释放锁时将本地内存中修改的 共享变量刷新到主内 ...

  10. 04.vue获取微博授权URL

    1.在Vue页面加载时动态发送请求获取微博授 权url 1.1 在 components\common\lab_header.vue 中写oauth动态获取微 博授权**URL // 获取微博登录地址 ...