阅读更多

0顶
0踩

编程语言

转载新闻 如何使用 Java 构建微服务?

2016-01-21 10:53 by 副主编 mengyidan1988 评论(4) 有8845人浏览
【编者按】微服务背后的大理念是将大型、复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化。本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊。本文转自OneAPM

快速预览

1.在 Java 生态系统中构建微服务的策略主要有:container-less, self-contained 和 in-container;
2.Container-less 微服务把应用程序及其所有依赖打包成单一的 jar 文件;
3.Self-contained 微服务也会将应用及其依赖打包成单一的Jar文件,但它还包含可能含有第三方库的嵌入式框架;
4.In-container 微服务会打包一个完整的 Java EE 容器,并且它的服务是在 Docker image 中实现。
基于微服务的架构设计是架构师和程序员们面临的一项新挑战。然而,随着语言及工具的不断更新,架构师们完全有能力征服这样的挑战。 Java 也不例外,本文探讨了使用Java生态系统来构建微服务的几种不同方式。

介绍
本文不会讨论微服务的好与坏,也不会建议你提前为微服务设计应用程序,或当它们出现在你庞大的应用中时,是否应该剥离这些微服务。

本文介绍的方法并不是唯一的,但应该可以达到抛砖引玉的效果。尽管本文的重点是使用 Java 生态系统来构建微服务,但这些概念同样可以转移到其它语言和技术中。

笔者把本文用到的方法命名为 container-less、self-contained 和 in-containe。这些名称或许不是非常正式,但足以区分相互间的差别。接下来,笔者会详细描述每种方法。

Container-less
在此方法中,开发者会将 JVM 之上的任何事物视为应用程序的一部分。

container-less 方法会启用所谓的单 jar 部署(也可称作“fat jar部署”),这也就意味着,应用程序及其所有依赖都会被打包成单一的jar文件,并且作为独立的Java进程运行。



$ java -jar myservice.jar

该方法的第一个优点就是当对应用的规模进行伸缩时,服务很容易按需求快速启动和停止;另一优点是方便部署,你只需要传递一个 jar 文件即可。

该方法的缺点就是库的兼容性。对于事务支持这类问题,你需要自己来实现,或必须引入第三方库才能实现。而后,如果你需要更多支持,例如持续性问题的支持,你就需要解决第三方库之间的兼容性问题。

Self-contained
另一种单 jar 部署就是使用一个嵌入式框架来构建服务。在此方法中,框架提供了所需服务的实现方法,开发者可以选择在项目中包括哪些服务。

你可能会认为这个方法与 container-less 完全一样,但笔者认为,两者的区别在于,self-contained 方法会提供一套相互兼容的第三方库。所以,该方法不存在库兼容性问题。



该方法可能涉及 Spring Boot、Wildfly Swarm 之类的工具。

Spring Boot
在Java中,Spring BootSpring Cloud Netflix项目对构建微服务提供了很好的支持。 Spring Boot 允许你选择各种 Spring 工具和其它流行的工具,然后把它们和你的应用打包成一个 jar 文件。Spring Initializr 提供了一个简单的复选框列表来完成上面这些事。一个简单的Hello World服务示例如下: Gist Snippet

Wildfly Swarm
在 Java EE 中,和 Spring Boot 相对应是Wildfly Swarm。它允许你根据自己的需求挑选 Java EE 规范,然后把它们和你的应用程序打包成一个 jar 文件。这里有一个简单的 Hello World 示例:Gist Snippet

self-contained 方法的优点是你可以自主选择用于服务运行的项目。

这种方法的缺点是配置更加复杂,由于它在实际的服务中构建所需的容器功能,由此产生的jar文件也会稍大一些。

In-container
虽然在 Java EE 容器中部署微服务的开销似乎很大,然而,一些开发者认为,微服务中的“微”并不表示该服务的小或者简单。



在这些案例中,将 Java EE 容器作为所需平台似乎是合适的。因此,你唯一需要的依赖就是 Java EE API 。注意,由于该依赖的实现是由容器提供的,因此该依赖项已经满足了,这也就意味着所产生的 war 文件是非常精简的,该服务的实现与上面 Wildfly Swarm 的例子是一样的:Gist Snippet

该方法的优点是,容器通过标准 API 提供了经过测试和验证的标准功能的实现。因此,开发者可以完全聚焦于业务功能,并在应用代码之外维护底层代码。

另一个优点是,应用程序代码不依赖 Java EE 应用服务器,无论该应用部署到 GlassFishWildFlyWebLogicWebSphere还是任何与 Java EE 兼容的其他实现系统。

该方法的缺点是你需要把服务部署到容器中,这样就增加了部署的复杂性。

Docker
现在来谈谈Docker 。通过把Java EE容器和服务实现打包到Docker镜像,你可以得到与单一 jar 部署相似的结果。唯一的不同是服务打包在 Docker 镜像中,而不是在 jar 文件中。
Dockerfile  
FROM jboss/wildfly:9.0.1.Final  
ADD myservice.war /opt/jboss/wildfly/standalone/deployments  

在Docker引擎中启动Docker镜像可以唤醒服务:
$ docker run -it -p 8081:8080 myorganization/myservice

Snoop
细心的读者可能已经在先前的 Spring Boot 代码段中注意到了 @EnableEurekaClient 注解。该注解在Eureka中注册服务,使其能够被服务消费者发现。 Eureka 是 Spring Cloud Netflix 包的一部分,并且是一个极易使用和配置服务发现的解决方案。

Java EE 在外部并没有提供这样的功能,但是有一些开源解决方案可以使用,其中一个就是Snoop它的功能与Eureka相似。要使 Java EE 微服务支持任务查找,唯一要做的是使用 @EnableSnoopClient 注解,如本例所示:Gist Snippet

总结
在构建微服务时, Java 是一个非常好的选择。本文中介绍的任何一种方法都可以实现微服务。当然,最好的方法还是根据服务需求而定。对于简单的服务, container-less 或者 self-contained 服务就是不错的选择。不过,借助 in-container ,开发者可以更快更简单地实现更高级的服务。无论针对哪种服务,Java 生态系统都能提供行之有效的实现方法。

原文:https://dzone.com/articles/building-microservices-with-java
译文地址:http://news.oneapm.com/building-microservices-with-java/
  • 大小: 146.5 KB
  • 大小: 176.6 KB
  • 大小: 140 KB
来自: OneAPM
0
0
评论 共 4 条 请登录后发表评论
4 楼 weiforyou 2016-01-25 18:23
wwwcomy 写道
微服务貌似火了好久,不过一直没听过国内互联网有把这东西用起来,好像还是讨论或者声称SOA的多一些。

还有Docker,看起来、试起来是巨方便无比,不过有真的国内互联网在用的实例么?

3 楼 wwwcomy 2016-01-25 13:11
sbdab 写道
wwwcomy 写道
微服务貌似火了好久,不过一直没听过国内互联网有把这东西用起来,好像还是讨论或者声称SOA的多一些。

还有Docker,看起来、试起来是巨方便无比,不过有真的国内互联网在用的实例么?

微服务用的很多啊、、、Docker也用的很多啊、、你这见识需要增长一下了吧、、


=.=距离互联网太远了 表示自己确实out了

话说有没有什么实例 比如哪家企业在哪块业务上用了这些东西用来解决啥问题的blog 求传送门
2 楼 sbdab 2016-01-25 10:55
wwwcomy 写道
微服务貌似火了好久,不过一直没听过国内互联网有把这东西用起来,好像还是讨论或者声称SOA的多一些。

还有Docker,看起来、试起来是巨方便无比,不过有真的国内互联网在用的实例么?

微服务用的很多啊、、、Docker也用的很多啊、、你这见识需要增长一下了吧、、
1 楼 wwwcomy 2016-01-23 22:58
微服务貌似火了好久,不过一直没听过国内互联网有把这东西用起来,好像还是讨论或者声称SOA的多一些。

还有Docker,看起来、试起来是巨方便无比,不过有真的国内互联网在用的实例么?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解

    WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。

  • Winform DataGridView单元格中动态添加多个控件

    版权声明:仅供学习。如有转载,请注明。 https://blog.csdn.net/C_gyl/article/details/85095021 简介:          在DataGridView的单元格中动态添加多个控件。例如在DataGridViewTextBox单元格中,添加CheckBox和Button控件。主题思路就是一个动态控件的大小...

  • datagrid 动态添加自定义控件方法!

    有很多朋友都在问这个怎么实现,今天把它给贴出来: CODE 1privatevoiddgSGJB_ItemDataBound(objectsender,System.Web.UI.WebControls.DataGridItemEventArgse) 2{ 3//判断只有数据项才添此控件。 4if(e.Item.ItemTy...

  • DataGrid的列中加入控件

    弄半天才出来的,在datagird中的列中控件,其实就是加入项目呈现器,并且两个很好用的隐式公有变量,outerDocment和data 

  • easyUI DataGrid View(数据表格展示) 表格添加按钮

    $('#tt').datagrid({ onLoadSuccess:function(){ $("a[class='easyui-linkbutton']").linkbutton({ }); } }); function add(value,row,index){ return "<a class='easyui-linkbutton'>编辑</a>"; }

  • 在datagrid中如何添加按钮及toolbar的应用

    其实,我们有时候在使用datagrid的时候,更多的时候我们是希望在数据后面有一个按钮,更利于我们操作,就想这样。 其实做到这样不难,今天进给大家介绍一个如何在datagrid上添加按钮,以及注意事项。 首先我们知道,这个按钮也是在columns中的,就像这样 , { title: &quot;出生日期&quot;, field: 'bornDate', width: 100, }...

  • datagridview 手动添加控件列方法(图)

    datagridview 手动添加控件列方法,来自于网络,备份一下,以免忘记。呵呵。。。  datagridview编辑时,随便添加一列,设置为非显示。 然后就可以添加一下的代码了。 '++++++++++++++++++++++++++++++         '指定行数の追加         DataGridView1.Rows.Add(20) '---------------

  • 为DataGrid添加CheckBox控件

    为DataGrid添加CheckBox控件 http://lucky_elove.www1.dotnetplayground.com/ 查看例子 CheckBoxDataGrid.aspx&amp;lt;xmp&amp;gt;&amp;lt;%@ Page Language=&quot;vb&quot; AutoEventWireup=&quot;false&quot; Codebehind=&quot;CheckBoxDataGrid.aspx.vb&quot; Inher...

  • 在datagridview中添加button按钮

    前言: .Net的DataGridView控件中,提供了一种列的类型,叫 DataGridViewButtonColumn ,这种列类型是展示为一个 按钮,可以给button赋予相应的text,并且,此button可以用来做处理事件的判断依据。 DataGridViewButtonColumn,虽然在UI展现上,是一个BUTTON的样子,但是,它的实际形态,并不是传统意义的BUTTON,而是渲...

  • 在datagrid上方添加按钮

    首先看一下效果图看看是不是大家想要的效果 上方的添加、删除、修改等按钮都是为了业务需求加上去的。那么给大家介绍一下如何去使用这些组件。其实这些按钮都属于toolbar里面的。这些toolbar记得要写在你的columns后面,toolbar也是datagrid中的属性,官方上面并没有介绍,只不过它确定是存在的,这个不用惊奇。 { title:&quot;编辑&quot;, field:'id...

  • DataGrid数据列表组件 使用手册

    1 列表组件 1.1 基本用法 1、 当前页面引入grid组件类库<c:set var="extLibs" value="grid"/> <sys:header title="单表管理" extLibs="${extLibs}" />2、 定义列表HTML元素<table id="dataGrid"></table> <div id="dataGridPage"></div>3、 编写

  • 强大的DataGrid组件[10]_自定义脚模板(FooterTemplate)——Silverlight学习笔记[18]

    在DataGrid的开发设计中,我们经常要对DataGrid中的数据进行统计,而统计的结果往往放置在DataGrid的底部,这就需要使用脚模板来对其进行处理。可是问题在于Silverlight并未提供现成的脚模板。于是,本文将为大家介绍如何为DataGrid添加设置脚模板。 需要了解的知识 我们知道DataGrid有一个十分重要的属性ItemsSource,它的作用是获取或设置被用于生成...

  • flex中dataGrid的编辑功能

    在flex的dataGrid中,很多情况下列是需要嵌入其他的控制的,比如:checkbox,combox等,此时需要利用dataGrid的如下功能:1.datagrid编辑功能简介    当我们点击datagrid中的一个单元格进行编辑时,可结合使用一些组件,RadioButtonGroup、checkbox、ComboBox等    datagrid的编辑功能必须使用以下组件:editorD

  • DataGrid的样式——添加按钮控件

    模板的使用而已,不仔细介绍了,直接上代码。 &lt;DataGrid Name="datagrid" AutoGenerateColumns="False" Style="{StaticResource dataGridStyle}" CanUserAddRows="False" ItemsSource="{Binding UserInfoList}" Ro

  • DataGrid里嵌入checkBox等控件等操作

    摘抄自http://www.iteye.com/topic/245624 &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;    &amp;lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;        layout=&quot;vertical&quot; backgroundColor=&quot;

  • 在DataGrid里内嵌控件

    在DataGrid里内嵌控件 在单元格里面内嵌控件,是一个迷人的功能。但是要用好这一招可并不像想象中那么容易。互联网上关于在DataGrid里面内嵌ComboBox的文章能把人看晕了。但是效果却不怎么理想。所以我认为要用好内嵌控件这招必须从根子上入手。DataGridColumnStyle这个类可能并不是非常引人注目,但是它的两个派生类我想大家都是非常熟悉的,那就是DataGridText

Global site tag (gtag.js) - Google Analytics