在社區或者QQ羣咱們常常看到有人爭辯編程語言的好壞,只要一提起這個話題經常就能引來不少人蔘與,每每最後就變成了一羣人幾個小時的罵戰。今天咱們要說的是如何讓Java和.Net(甚至更多語言)相結合。充分發揮其優點揚長避短。java
一、Anno是什麼?git
Anno是一個微服務框架引擎。入門簡單、安全、穩定、高可用、全平臺可監控、依賴第三方框架少。底層通信RPC(Remote Procedure Call)採用穩定可靠通過無數成功項目驗證過的跨語言的thrift、
grpc
。 自帶服務註冊發現健康檢查(不依賴於Etcd、Consul、Zookeeper)、調用鏈追蹤、Cron 調度、限流、事件總線等等。github
2、Java和.Net 混合開發 spring
Java的生態很強大,可是他的語法也經常讓人詬病。提起.Net常常有人說他不能跨平臺(其實早期.net 能夠藉助Mono跨平臺,而且在多個領域取得了不可磨滅的成績),國內生態很差。隨着.net core 的出現和前段時間.Net5的發佈,讓.net 跨平臺更容易。而且.net 有着超高的性能、優雅的語法等等不少方面被人稱讚。在編程語言百花齊放的今天,咱們須要揚長避短利用不一樣編程語言各自的優點爲咱們提供更好的服務。就在這種場景下咱們推出了 Anno微服務框架,讓微服務、跨語言混合開發變的更簡單更容易。 apache
在Anno中調用方(Client)無需知道服務提供方(Provider)的地址、端口、開發語言等等信息,所以咱們在開發過程當中對於咱們須要的服務咱們只管經過Client SDK調用,無需關注細節。這樣咱們也避免了在多語言開發的微服務中帶來的各類奇葩問題。編程
下圖是一個在線體驗的環境:http://140.143.207.244/安全
Java服務的資源監控app
.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。