当前位置:首页 > 数码 > 成功麻利性-的灵活性能-经过文件和-Envoy-API

成功麻利性-的灵活性能-经过文件和-Envoy-API

admin5个月前 (05-13)数码19

前面咱们和大家学习了Envoy的基础常识,经常使用静态性能来意识了Envoy,但实践上Envoy的闪光点在于其灵活性能,灵活性能关键有基于文件和API两种方式。

基于文件的灵活性能

Envoy除了支持静态性能之外,还支持灵活性能,而且灵活性能也是Envoy重点关注的性能,本节咱们将学习如何将Envoy静态性能转换为灵活性能,从而准许Envoy智能降级。

Envoy灵活性能

前面的章节中,咱们都是间接经常使用的静态性能,但是当咱们须要更改性能的时刻就比拟费事了,须要重启Envoy代理才会失效。要处置这个疑问,咱们可以将静态性能更改成灵活性能,当咱们经常使用灵活性能的时刻,更改了性能,Envoy将会智能去从新加载性能。

Envoy支持不同的模块进执行态性能,可性能的有如下几个API(统称为xDS):

灵活资源,是指由Envoy经过xDS协定发现所须要的各项性能的机制,关系的性能消息保留于称之为治理主机(ManagementServer)的主机上,经由xDSAPI向外泄露;上方是一个纯灵活资源的基础性能框架。

{"lds_config":"{...}","cds_config":"{...}","ads_config":"{...}"}

xDSAPI为Envoy提供了资源的灵活性能机制,它也被称为DataPlaneAPI。

Envoy支持三种类型的性能消息的灵活发现机制,关系的发现服务及其相应的API联结起来称为xDSAPI。

v3版本的xDS支持如下几种资源类型:

Envoy对xDSAPI的治理由后端主机成功,包括LDS、CDS、RDS、SRDS(ScopedRoute)、VHDS(VirtualHost)、EDS、SDS、RTDS(Runtime)等。

接上去咱们先更改性能来经常使用EDS,让Envoy依据性能文件的数据来灵活减少节点。

首先咱们这里定义了一个基本的Envoy性能文件,如下所示:

#envoy.yamladmin:access_log_path:/tmp/admin_access.logaddress:socket_address:address:0.0.0.0port_value:9901static_resources:listeners:-name:listener_0#监听器的称号address:socket_address:address:0.0.0.0#监听器的地址port_value:10000#监听器的端口filter_chns:-filters:-name:envoy.filterswork.http_connection_managertyped_config:"@type":type.apis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix:ingress_httpaccess_log:-name:envoy.access_loggers.stdouttyped_config:"@type":type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLoghttp_filters:#定义http过滤器链-name:envoy.filters.http.router#调用7层的路由过滤器typed_config:"@type":type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerroute_config:name:local_routevirtual_hosts:-name:backenddomains:["*"]routes:-match:prefix:"/"route:cluster:targetCluster

如今咱们还没有性能clusters集群局部,这是由于咱们要经过经常使用EDS来启动智能发现。

首先咱们须要减少一个node节点让Envoy来识别并运行这一个惟一的性能,灵活性能中Envoy实例须要有惟一的id标识。将上方的性能搁置在性能文件的顶部区域:

node:id:envoy_eds_idcluster:youdianzhishi_cluster

除了id和cluster之外,咱们还可以性能基于区域的一些位置消息来启动申明,比如region、zone、sub_zone等。

EDS性能

端点发现服务EDS是基于gRPC或REST-JSONAPI主机的xDS治理主机,Envoy经常使用它来失掉集群成员。集群成员在Envoy术语中称为端点。关于每个集群,Envoy从发现服务失掉端点,EDS是首选的服务发现机制:

接上去咱们就可以来定义EDS性能了,可以来灵活控制抢先集群数据。在前面这局部的静态性能是这样的:

clusters:-name:targetClusterconnect_timeout:0.25stype:STRICT_DNSdns_lookup_family:V4_ONLYlb_policy:ROUND_ROBINload_assignment:cluster_name:targetClusterendpoints:-lb_endpoints:-endpoint:address:socket_address:address:192.168.215.3port_value:80-endpoint:address:socket_address:address:192.168.215.4port_value:80

如今咱们将上方的静态性能转换成灵活性能,首先须要转换为基于EDS的eds_cluster_config属性,并将类型更改为EDS,将上方的集群性能减少到Envoy性能的末尾:

clusters:-name:targetClusterconnect_timeout:0.25slb_policy:ROUND_ROBINtype:EDSeds_cluster_config:service_name:localservices#可选,替代集群的称号,提供应EDS服务eds_config:#集群的EDS降级源性能path_config_source:#本地文件功动力path:"/etc/envoy/eds.yaml"#watched_directory:#可选,监督目录中的文件更改#path:"/etc/envoy"

在上方的集群性能中咱们设置了type:EDS,示意这是一个基于EDS的集群性能,而后经常使用eds_cluster_config属性来定义EDS的性能消息,其中service_name属性是可选的,假设没有设置则经常使用集群的称号,这个属性是提供应EDS服务的,eds_config属性定义了EDS降级源的性能,这里咱们经常使用的是本地文件功动力,所以经常使用path_config_source属性来指定本地性能文件的门路,这里咱们经常使用的是/etc/envoy/eds.yaml这个文件,这个文件将会被Envoy代理监督,当文件内容出现变动的时刻,Envoy将会智能降级性能。

此外还可以性能一个watched_directory属性来监督目录中的文件更改,当该目录中的文件被移动到时,该门路将被从新加载。这在某些部署场景中是必需的。比如假设咱们经常使用KubernetesConfigMap来加载xDS资源,则或许会经常使用以下性能:

上述性能将确保Envoy监督所属目录的移动,这是由于Kubernetes在原子降级时期治理ConfigMap符号链接的方式而必需的。

抢先的主机192.168.215.3和192.168.215.3就未来自于/etc/envoy/eds.yaml这个文件,咱们创立一个如下所示的eds.yaml文件,内容如下所示:

resources:-"@type":type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignmentcluster_name:localservices#集群的称号,假设在集群eds_cluster_config中指定,这将是service_name值。endpoints:-lb_endpoints:-endpoint:address:socket_address:address:192.168.215.3port_value:80

上方咱们临时只定义了192.168.215.3这一个端点。该性能文件是以DiscoveryResponse的格局提供照应实例的。

如今性能成功后,咱们可以启动Envoy代理来启动测试。执行上方的命令启动Envoy容器:

$run--name=proxy-eds-d-p9901:9901-p80:10000-v$(pwd)/manifests/3.Envoy:/etc/envoyenvoyproxy/envoy:v1.28.0

而后雷同和前面一样运转两个HTTP服务来作为抢先主机:

API$dockerrun-dcnych/docker-http-server;dockerrun-dcnych/docker-http-server;$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES4ee790db09dbcnych/docker-http-server"/"3secondsagoUp3seconds80/tcpfervent_khoranaf9456b56f1ffcnych/docker-http-server"/app"4secondsagoUp3seconds80/tcpwonderful_carsonf9ce95dcc434envoyproxy/envoy:v1.28.0"/docker-entrypoint.…"AboutaminuteagoUp44seconds0.0.0.0:9901->9901/tcp,:::9901->9901/tcp,0.0.0.0:80->10000/tcp,:::80->10000/tcpproxy-eds

依据上方的EDS性能,Envoy将把一切的流量都发送到192.168.215.3这一个节点上去,咱们可以经常使用curllocalhost来测试下:

$curllocalhost<h1>Thisrequestwasprocessedbyhost:f9456b56f1ff</h1>$curllocalhost<h1>Thisrequestwasprocessedbyhost:f9456b56f1ff</h1>

可以看到可以反常失掉照应,而且都是由f9456b56f1ff这个容器来处置的恳求。如今咱们来尝试降级上方的EDS性能减少上另外的一个节点,观察Envoy代理能否会智能失效。

由于咱们这里经常使用的是EDS灵活性能,所以当咱们要扩展抢先服务的时刻,只有要将新的端点减少到上方咱们指定的eds.yaml性能文件中即可,而后Envoy就会智能将新减少的端点蕴含出去。用上方雷同的方式减少192.168.215.4这个端点,eds.yaml内容如下所示:

resources:-"@type":type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignmentcluster_name:localservices#集群的称号,假设在集群eds_cluster_config中指定,这将是service_name值。endpoints:-lb_endpoints:-endpoint:address:socket_address:address:192.168.215.3port_value:80-endpoint:address:socket_address:address:192.168.215.4port_value:80

降级后,反常状况下Envoy就会智能从新加载性能并将新的端点减少到负载平衡中去,这个时刻咱们再来访问代理:

$curllocalhost<h1>Thisrequestwasprocessedbyhost:2135ba4e10c9</h1>$curllocalhost<h1>Thisrequestwasprocessedbyhost:f9456b56f1ff</h1>

可以看到曾经可以智能访问到另外的端点去了。

CDS性能

如今曾经性能好了EDS,接上去咱们就可以去扩展抢先集群的规模了,假设咱们想要能够灵活减少新的域名和集群,就须要成功集群发现服务(CDS)API,在上方的示例中,咱们将性能集群发现服务(CDS)和监听器发现服务(LDS)来进执行态性能。

创立一个名为cds.yaml的文件来性能集群服务发现的数据,文件内容如下所示:

resources:-"@type":type.googleapis.com/envoy.config.cluster.v3.Clustername:targetClusterconnect_timeout:0.25slb_policy:ROUND_ROBINtype:EDSeds_cluster_config:service_name:localserviceseds_config:path:/etc/envoy/eds.yaml

此外,还须要创立一个名为lds.yaml的文件来搁置监听器的性能,文件内容如下所示:

resources:-"@type":type.googleapis.com/envoy.config.listener.v3.Listenername:listener_0#监听器的称号address:socket_address:address:0.0.0.0#监听器的地址port_value:10000#监听器的端口filter_chains:-filters:-name:envoy.filters.network.http_connection_managertyped_config:"@type":type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix:ingress_httpaccess_log:-name:envoy.access_loggers.stdouttyped_config:"@type":type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLoghttp_filters:#定义http过滤器链-name:envoy.filters.http.router#调用7层的路由过滤器typed_config:"@type":type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerroute_config:name:local_routevirtual_hosts:-name:backenddomains:["*"]routes:-match:prefix:"/"route:cluster:targetCluster

细心观察可以发现cds.yaml和lds.yaml性能文件的内容基本上和之前的静态性能文件分歧的。咱们这里只是将集群和监听器拆分到外部文件中去,这个时刻咱们须要修正Envoy的性能来援用这些文件,咱们可以经过将static_resources更改为dynamic_resources来启动性能。

从新新建一个Envoy性能文件,命名为envoy-dynamic.yaml,内容如下所示:

#envoy-dynamic.yamlnode:id:envoy_eds_idcluster:youdianzhishi_clusteradmin:access_log_path:"/dev/null"address:socket_address:address:0.0.0.0port_value:9901dynamic_resources:#灵活性能lds_config:path:"/etc/envoy/lds.yaml"cds_config:path:"/etc/envoy/cds.yaml"

而后经常使用上方的性能文件从新启动一个新的Envoy代理,命令如下所示:

$dockerrun--name=proxy-xds-d-p9901:9901-p80:10000-v$(pwd)/manifests/3.Envoy:/etc/envoy-v$(pwd)/manifests/3.Envoy/envoy-dynamic.yaml:/etc/envoy/envoy.yamlenvoyproxy/envoy:v1.28.0

启动成功后,雷同可以访问Envoy代理来测试能否失效了:

$curllocalhostcurllocalhost<h1>Thisrequestwasprocessedbyhost:4ee790db09db</h1>$curllocalhost<h1>Thisrequestwasprocessedbyhost:f9456b56f1ff</h1>

如今咱们再基于上方性能的CDS、LDS、EDS的性能来灵活减少一个新的集群。比如减少一个名为newTargetCluster的集群,内容如下所示:

#cds.yamlresources:-"@type":type.googleapis.com/envoy.config.cluster.v3.Clustername:targetClusterconnect_timeout:0.25slb_policy:ROUND_ROBINtype:EDSeds_cluster_config:service_name:localserviceseds_config:path:/etc/envoy/eds.yaml-"@type":type.googleapis.com/envoy.config.cluster.v3.Clustername:newTargetClusterconnect_timeout:0.25slb_policy:ROUND_ROBINtype:EDSeds_cluster_config:service_name:localserviceseds_config:path:/etc/envoy/eds-1.yaml

上方咱们新增了一个新的集群,对应的eds_config性能文件是eds-1.yaml,所以咱们雷同须要去创立该文件去性能新的端点服务数据,内容如下所示:

resources:-"@type":type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignmentcluster_name:localservices#集群的称号,假设在集群eds_cluster_config中指定,这将是service_name值。endpoints:-lb_endpoints:-endpoint:address:socket_address:address:192.168.215.5port_value:80-endpoint:address:socket_address:address:192.168.215.6port_value:80

这个时刻新的集群减少上了,但是还没有任何路由来经常使用这个新集群,咱们可以在lds.yaml中去性能,将之前性能的targetCluster交流成newTargetCluster。

当然雷同咱们这里还须要运转两个便捷的HTTP服务来作为抢先服务提供服务,执行如下所示的命令:

$dockerrun-dcnych/docker-http-server;dockerrun-dcnych/docker-http-server;

这个时刻Envoy应该就会智能从新加载并减少新的集群,咱们雷同可以执行curllocalhost命令来验证:

$curllocalhost<h1>Thisrequestwasprocessedbyhost:5f43efcb9432</h1>$curllocalhost<h1>Thisrequestwasprocessedbyhost:4986b39d716f</h1>

可以看到曾经变成了新的两个端点数据了,证实咱们这里基于文件的xDS灵活性能曾经失效了。

基于API的灵活性能

当在Envoy性能中定义了抢先集群后,Envoy须要知道如何解析集群成员,这就是服务发现。端点发现服务(EDS)是Envoy基于gRPC或许用来失掉集群成员的REST-JSONAPI服务的xDS治理服务。在本节咱们将学习如何经常使用REST-JSONAPI来性能端点的智能发现。

在前面的章节中,咱们经常使用文件来定义了静态和灵活性能,在这里咱们将引见另外一种方式来进执行态性能:API灵活性能。

Envoy名目在和Golang中都提供了EDS和其余服务发现的gRPC成功参考。

REST-JSON服务

接上去咱们将更改性能来经常使用EDS,从而准许基于来自REST-JSONAPI服务的数据进执行态减少节点。

EDS性能

上方是提供的一个Envoy性能的初始性能envoy.yaml,文件内容如下所示:

#envoy.yamladmin:access_log_path:/tmp/admin_access.logaddress:socket_address:address:0.0.0.0port_value:9901static_resources:listeners:-name:listener_0#监听器的称号address:socket_address:address:0.0.0.0#监听器的地址port_value:10000#监听器的端口filter_chains:-filters:-name:envoy.filters.network.http_connection_managertyped_config:"@type":type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix:ingress_httpaccess_log:-name:envoy.access_loggers.stdouttyped_config:"@type":type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLoghttp_filters:#定义http过滤器链-name:envoy.filters.http.router#调用7层的路由过滤器typed_config:"@type":type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerroute_config:name:local_routevirtual_hosts:-name:backenddomains:["*"]routes:-match:prefix:"/"route:cluster:targetCluster

接上去须要减少一个EDS类型的集群性能,并在eds_config中性能经常使用RESTAPI:

clusters:-name:targetClustertype:EDSconnect_timeout:0.25seds_cluster_config:service_name:myserviceeds_config:resource_api_version:V3#xDS资源的API版本,支持AUTO、V2、V3,假设未指定,默以为v2。api_config_source:#api_config_source的数据来自于xDSAPIServer,即ManagementServer。api_type:RESTcluster_names:[xds_cluster]#该字段只用于REST,cluster_names的集群必定是静态定义的,其类型不能是EDS。transport_api_version:V3refresh_delay:5s

上方性能中咱们经常使用api_config_source来经常使用RESTAPI的性能,其中api_type属性指定了经常使用RESTAPI,cluster_names属性指定了经常使用xds_cluster这个集群来失掉数据,refresh_delay属性指定了刷新距离时期,这里咱们设置为5秒。

而后须要定义xds_cluster的解析方式,这里咱们可以经常使用静态性能:

-name:xds_clustertype:STATICconnect_timeout:0.25sload_assignment:cluster_name:xds_clusterendpoints:-lb_endpoints:-endpoint:address:socket_address:address:192.168.0.112port_value:8080

而后雷同启动一个Envoy代理实例来启动测试:

$dockerrun--name=api-eds-d-p9901:9901-p80:10000-v$(pwd)/manifests/4.Envoy:/etc/envoyenvoyproxy/envoy:v1.28.0

而后启动一个如下所示的抢先端点服务:

$dockerrun-p8081:8081-d-ecnych/docker-http-server:v4

启动成功后咱们可以经常使用如下命令来测试抢先的端点服务:

$curl

如今咱们启动了Envoy代理和抢先的服务集群,但是由于咱们这里启动的服务并不是xds_cluster中性能的服务,所以还没有衔接它们。这个时刻咱们去检查Envoy代理得日志,可以看到如下所示的一些失误:

$dockerlogs-fapi-eds[2023-10-2708:43:48.964][1][warning][config][source/extensions/config_subscription/rest/http_subscription_impl.cc:120]RESTupdatefor/v3/discovery:endpointsfailed......

启动EDS服务

为了让Envoy失掉端点服务,咱们须要启动xds_cluster,咱们这里将经常使用python成功的一个REST-JSON的治理服务,代码如下所示:

#server.pyfromflaskimportFlask,request,jsonifyimportuuidapp=Flask(__name__)#存储endpoints的数据库endpoints_db={}@app.route('/endpoints',methods=['POST'])defadd_endpoint():>$pythonserver.py*ServingFlaskapp'server'*Debugmode:onWARNING:Thisisadevelopmentserver.Donotuseitinaproductiondeployment.UseaproductionWSGIserverinstead.*Runningonalladdresses(0.0.0.0)*Runningon!*DebuggerPIN:131-555-179

要留意前面性能的xds_cluster的地址和端口要和上方的服务分歧,并要能够访问到。

而后咱们就可以将抢先的服务性能减少到EDS服务中去了,这样可以让Envoy来智能发现抢先服务。上方的治理服务中咱们定义了一个/endpoints的减少端点的接口,咱们只有要将要减少的端点提交给这个接口即可,而后在发现接口外面会智能失掉减少的端点,而后Envoy就可以灵活感知到了。

$curl--location--requestPOST'http://localhost:8080/endpoints'--header'Content-Type:application/json'--data-raw'{"address":"192.168.215.7","port_value":8081}'

由于咱们曾经启动了上方注册的抢先服务,所以如今咱们可以经过Envoy代理访问到它了:

$curl-i

接上去咱们在抢先集群中运转更多的节点,并调用API来进执行态注册,经常使用如下所示的命令来向抢先集群再减少4个节点:

foriin8082808380848085dodockerrun-d-eEDS_SERVER_PORT=$icnych/docker-http-server:v4;sleep.5done

而后将上方的4个节点注册到EDS服务上方去,雷同经常使用如下所示的API接口调用:

$curl--location--requestPOST'http://localhost:8080/endpoints'--header'Content-Type:application/json'--data-raw'{"address":"192.168.215.8","port_value":8082}'$curl--location--requestPOST'http://localhost:8080/endpoints'--header'Content-Type:application/json'--data-raw'{"address":"192.168.215.9","port_value":8083}'$curl--location--requestPOST'http://localhost:8080/endpoints'--header'Content-Type:application/json'--data-raw'{"address":"192.168.215.10","port_value":8084}'$curl--location--requestPOST'http://localhost:8080/endpoints'--header'Content-Type:application/json'--data-raw'{"address":"192.168.215.11","port_value":8085}'

注册成功后,咱们可以经过如下所示的命令来验证网络恳求能否与注册的节点之间是平衡的:

$whiletrue;docurl

依据上方的输入结果可以看到每次恳求的服务是不同的照应,咱们一共注册了5个端点服务。

到这里咱们就成功了基于REST-JSON方式的EDS灵活性能了,当然在实践经常使用的时刻,更多的时刻会经常使用gRPC的方式来成功治理服务,这样可以成功流式的数据传输,愈加高效,可以检查官网提供的go-control-plane示例了解如何成功(。

gRPCxDS服务相比REST-JSONxDS服务,理论更为复杂一些,由于gRPC是基于HTTP/2的,并且经常使用ProtocolBuffers作为序列化协定。

首先咱们须要定义一个gRPC服务来成功xDSAPI。可以从Envoy的data-plane-api(失掉.proto文件,而后可以经常使用protoc编译器生成Python代码,而后就可以去成功详细的业务逻辑了,比如istio就相似这种方式。


struts+hibernate+spring三大框架

框架说白了就是JAVA工作者多年以来总结出的一些开发标准。 让我们可以以成功的经验模式来开发我们自已的系统,一般使用框架的好处是·在好的框架下,开发者只需要写一些必须的代码;他们不需要直接接触底层的API。 这一点很重要。 ·经过良好设计的框架可以为程序提供清晰的结构并且提高程序的内聚性。 好清晰的结构使得其他人可以更容易加入项目。 ·一个容易使用的框架可以通过一些例子和文档为用户提供最佳实践。 ·采用成功的框架的代码比自己的代码容易测试J2EE本身提供了一些框架。 比如, Enterprise Java-Beans (EJB) container或者 Servlet engine 而这些框架一般在中小工程中我们都不会使用,会让我们把大量的时间浪费在开发框架上。 而现在比较流行开源框架,主要是struts,hibernate,spring等比如struts是在原有mvc基础上实现在代码分离等功能,非常好用。 而hibernate可以把我们的关系型数据库转换成我们在JAVA中的面像对像来使用。 从而让我们在开发时不需要直接写SQL语句,比如();就可以直接把数据库中的用户名取出来。 SpringJ2EE框架被大规模地运用到项目中,而项目总要负责这些框架以及自己业务代码的连接,使之真正融合到一起。 Spring就是专注于这个问题的,它和Hibernate融合的很好。 这三种框架在一起并不冲突,所以现在最常用的框架就是struts+hibernate+spring就像我们盖房子一样,先把框架搭好,我们在在上面写代码就很规范。 Struts框架介绍 :Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。 Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的 Action,也为V(View)提供了一系列定制标签(Custom Tag)。 但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。 Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。 在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实 现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。 就是说可将两者一起使用,达到将两者自身的特点进行互补。 spring 框架介绍 :它关注的领域是其他许多流行的Framework未曾关注的。 Spring要提供的是一种管理你的业务对象的方法。 Spring既是全面的又是模块化的。 Spring有分层的体系结构,这意味着你能选择仅仅使用它任何一个独立的部分,而它的架构又是内部一致。 因此你能从你的学习中,得到最大的价值。 例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。 它的设计从一开始就是要帮助你编写易于测试的代码。 Spring是使用测试驱动开发的工程的理想框架。 Spring不会给你的工程添加对其他的框架依赖。 Spring也许称得上是个一站式解决方案,提供了一个典型应用所需要的大部分基础架构。 它还涉及到了其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源项目,但Spring有深厚的历史根基。 Spring架构上的好处在我们进入细节之前,让我们来看看Spring能够给工程带来的种种好处:Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。 如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 Spring能消除在许多工程中常见的对Singleton的过多使用。 根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。 曾经对某个类要寻找的是哪个 魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。 Inversion of Control的使用(在下面讨论)帮助完成了这种简化。 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。 Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。 在Spring应用中的大多数业务对象没有依赖于Spring。 使用Spring构建的应用程序易于单元测试。 Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。 你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 Spring帮助你解决许多问题而无需使用EJB。 Spring能提供一种EJB的替换物,它们适用于许多web应用。 例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。 Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。

Microsoft的发展史

Windows NT4.0的主要特点有:1、 通信服务:内置强大的通信服务,如传输控制协议/Internet协议(简称TCP/IP)网络、路由和远程访问,您可以简单的将这些性能添加到嵌入式解决方案中。 2、 完全的Win32 API支持:完全的支持Win32应用程序编程接口(API),您可以跨所有Windows NT平台创建标准化应用程序。 3、 高级编程性能:高级编程性能包括支持组件对象模型(COM)、分布式COM(DCOM)和电话API (TAPI),使用者可以在一个可重用的、面向对象的环境中快速构建革新的解决方案。 4、 支持Windows NT服务:支持Windows NT服务,例如事件察看器和性能监视器,可以为使用者的嵌入式解决方案提供增强的监视和报告功能。 5、 远程可管理性:Microsoft和第三方提供的管理特性可以简化嵌入式解决方案的管理工作,甚至还可以将这些特性集成到信息技术(IT)管理基础构架中。 小编评论:可以说Windows的简单易用和桌面版的市场占有率造就了Windows NT 4.0的成功,而Windows NT所获得的巨大利润也使得Microsoft帝国完全成型……,我们不得不说Microsoft在商业上的运营的确非常到位!

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Envoy