网络编程语言c语言
随着微服务架构的出现,通过使用大量较小的程序来开发应用程序。 这些程序是单独构建的,并已部署到可以独立扩展的平台中。 这些程序通过简单的应用程序编程接口(API)通过网络相互通信。 由于这些应用程序具有分解和网络分布式的性质,因此开发人员必须将分布式计算的谬误作为其应用程序逻辑的一部分来处理。
数十年来,编程语言一直将网络简单地视为I / O源。 因此,为了公开简单的API,开发人员必须通过编写一个等待网络请求直到获得信号的显式循环来实现这些服务。 要使用这些API,在客户端,开发人员必须实现不同的弹性技术,例如重试,故障转移和负载平衡,以应对不可靠的网络行为。
Ballerina是一种开放源代码编程语言,它引入了客户端对象,服务,资源功能和侦听器的基本的,新的抽象,以将网络纳入该语言。 开发人员可以使用语言提供的构造来编写这些网络程序,并且可以正常工作。
服务
Ballerina介绍了服务类型化,其中服务可以具有一种或多种实现应用程序逻辑的资源方法。 服务可以与侦听器对象一起使用。 侦听器对象提供网络和服务之间的接口。 它根据定义的协议从远程进程接收网络消息,并将其转换为对已附加到侦听器对象的服务的资源方法的调用。 HTTP / HTTPS,HTTP2,gRPC和WebSocket是侦听器对象中现成支持的某些协议。
以下代码说明了一个具有sayHello资源方法的hello服务,该方法返回“ Hello World!”。
import ballerina/http;
import ballerina/log;listener http:Listener helloWorldEP = new ( 9090 );service hello on helloWorldEP {resource function sayHello (http:Caller caller,
http:Request request) {var result = caller->respond( "Hello World!" );if (result is error) {log:printError( "Error in responding " , err = result);}}
}
Ballerina源文件可以编译成可执行jar。
$ ballerina build hello.bal
Compiling sourcehello.bal
Generating executablesHello.jar
$ java -jar hello.jar
[ballerina/http] started HTTP/WS listener 0.0.0.0:9090
$ curl http://localhost:9090/hello/sayHello
Hello, World!
Ballerina服务带有内置并发。 对资源方法的每个请求都在一个单独的链(Ballerina并发单元)中处理,并且将隐式的并发行为提供给服务。
以下示例芭蕾舞演员(BBE)在侦听器对象中显示了不同的协议支持:
- HTTPS
- WebSocket升级
- HTTP 2.0
- gRPC
异步网络协议
在请求-响应范例中,网络通信是通过阻止呼叫来完成的。 但是阻止线程进行网络调用非常昂贵。 因此,编程语言支持asyncio,并且开发人员必须使用基于回调的代码技术来实现async / await。 Ballerina请求-响应协议是开箱即用的非阻塞协议,在Ballerina协议实现的底层将负责异步调用。 以下代码片段显示了对简单HTTP GET请求端点的调用,其中Ballerina HTTP客户端协议实现将处理底层调用的非阻塞性质。
import ballerina/http;
import ballerina/io;http:Client clientEndpoint = new ( "http://postman-echo.com" );public function main () {var response = clientEndpoint->get( "/get?test=123" );if (response is http:Response) {// logic for handle response} else {io :println( "Error when calling the backend: " , response.reason());}
}
客户对象
客户端对象是一个存根,它允许工作人员根据某种协议将网络消息发送到远程进程。 客户端对象的远程方法对应于协议定义的针对客户端对象所扮演角色的不同网络消息。
以下示例说明了通过在twitter客户端对象中调用tweet远程方法来发送tweet。
import ballerina/config;
import ballerina/log;
import wso2/twitter;// Twitter package defines this type of endpoint
// that incorporates the twitter API.
// We need to initialize it with OAuth data from apps.twitter.com.
// Instead of providing this confidential data in the code
// we read it from a toml file.
twitter:Client twitterClient = new ({clientId : config:getAsString( "clientId" ),clientSecret : config:getAsString( "clientSecret" ),accessToken : config:getAsString( "accessToken" ),accessTokenSecret : config:getAsString( "accessTokenSecret" ),clientConfig : {}
});public function main () {twitter:Status|error status &#61; twitterClient->tweet( "Hello World!" );if (status is error) {log :printError( "Tweet Failed" , status);} else {log :printInfo( "Tweeted: " &#43; <&#64;untainted > status.id.toString());}
}
程序通过使用客户端对象&#xff08;twitterClient&#xff09;中定义的协议调用远程方法&#xff08;tweet&#xff09;来发送消息。 返回值&#xff08;twitter&#xff1a;Status&#xff09;对应于协议的响应。
顺序图
序列图是可视化描述服务交互方式的最佳方法。 这是设计用于并行和网络交互的Ballerina语言抽象的语法和语义的基础&#xff0c;以便它与序列图紧密对应。 在Ballerina中&#xff0c;使用与非远程方法不同的语法&#xff08;->&#xff09;调用远程方法&#xff0c;并在序列图中将其描述为从工作人员生命线到客户对象生命线的水平箭头。
此外&#xff0c;这是Ballerina语法中代码的文本表示形式和序列图形式的可视表示形式之间的双向映射。 Ballerina IDE插件&#xff08;例如VSCode插件 &#xff09;可以从源代码动态生成序列图。
下图是从Salesforce集成的示例微服务生成的。
弹性
由于网络的不可靠特性&#xff0c;需要以处理故障的方式编写网络程序。 有时&#xff0c;自动重试将有助于从此类故障中恢复。 在某些情况下&#xff0c;故障转移技术将有助于实现不间断的服务交付。 此外&#xff0c;断路器等技术还有助于防止跨多个程序的灾难性级联故障&#xff0c;并有助于恢复故障程序。 诸如断路器&#xff0c;负载平衡&#xff0c;故障转移&#xff0c;重试和超时之类的弹性技术在Ballerina的客户端对象中是开箱即用的。
以下代码片段显示了如何配置断路器以处理Ballerina HTTP客户端对象中与网络相关的错误。
http:Client backendClientEP &#61;new ( "http://localhost:8080" , {circuitBreaker: {rollingWindow: {timeWindowInMillis: 10000 ,bucketSizeInMillis: 2000 ,requestVolumeThreshold: 0},failureThreshold: 0.2 ,resetTimeInMillis: 10000 ,statusCodes: [ 400 , 404 , 500 ]},timeoutInMillis: 2000});
以下BBE展示了Ballerina在不同弹性技术支持下的工作样本。
错误处理
由于网络固有的不可靠性&#xff0c;错误是网络编程的预期部分。 Ballerina的方法是显式检查错误&#xff0c;而不是将其视为异常。 通过设计来忽略错误几乎是不可能的。 Ballerina具有内置的错误类型&#xff0c;该错误类型具有两个组成部分&#xff1a;一个字符串&#xff0c;用于标识错误原因&#xff1b;一个映射&#xff0c;用于提供有关该错误的其他详细信息。
让我们以上面讨论的相同的tweet示例为例。
twitter:Status|error status &#61; twitterClient->tweet("Hello World!" );if (status is error) {log :printError( "Tweet Failed" , status);} else {log :printInfo( "Tweeted: " &#43; <&#64;untainted > status.id.toString());}
tweet远程方法可以返回预期的twitter&#xff1a;Status值或由于网络不可靠而导致的错误。 Ballerina支持联合类型&#xff0c;因此状态变量可以是twitter&#xff1a;Status或错误类型。 上面的代码段显示了如何显式检查错误。 Ballerina IDE工具还支持类型保护&#xff0c;它可指导开发人员在if-else块中正确处理错误和值。
以下BBE演示了Ballerina中全面的错误处理功能。
- 错误处理
- 检查一下
- 恐慌
- 检查恐慌
- 陷阱
- 用户定义的错误类型
网络数据安全
分布式系统通过在不同组件之间共享数据来工作。 网络安全起着至关重要的作用&#xff0c;因为所有这些通信都是通过网络进行的。 Ballerina提供了内置的库来实现传输级安全性&#xff0c;并提供加密库来保护数据。 以下BBE显示了Ballerina的加密操作支持。
身份和访问管理在基于微服务的应用程序中扮演着至关重要的角色。 通常&#xff0c;对于初始登录&#xff0c;通常用户提供用户名/ ID和密码。 但是在随后的访问中&#xff0c;COOKIE或随机令牌被用作身份证明。 Ballerina通过使用基本身份验证&#xff0c;OAuth和JWT支持对服务以及客户端的开箱即用保护。 以下BBE显示了如何通过执行授权来保护服务和客户端。
- JWT提供的安全服务
- 使用基本身份验证的安全服务
- 使用OAuth2的安全服务
- 具有基本身份验证的受保护客户端
- 具有JWT Auth的受保护客户端
- 使用OAuth2的受保护客户端
Ballerina http&#xff1a;Listener和http&#xff1a;Client具有开箱即用的支持&#xff0c;可通过OCSP&#xff08;在线证书状态协议&#xff09;装订&#xff0c;OCSP和CRL来验证证书吊销。 Ballerina侦听器和客户端对象支持网络编程中所需的所有主要功能&#xff0c;以实现网络通信的端到端保护。
除此之外&#xff0c;Ballerina在其编译器中还具有内置的污染分析仪。 污染分析旨在通过防止任何可由用户输入修改的变量来提高安全性。 如果未正确检查&#xff0c;所有用户输入都可能很危险。 污点分析机制的结果是&#xff0c;Ballerina编译器通过观察污点数据如何在程序中传播来识别不受信任&#xff08;污点&#xff09;的数据。
如果将不受信任的数据传递给安全敏感的参数&#xff0c;则会生成编译器错误。 由于污点检查发生在编译器阶段&#xff0c;因此程序员可以重新设计程序&#xff0c;以在危险输入周围建立安全墙。 以下BBE显示了对Ballerina的支持。
默认情况下的可观察性
较小程序的数量增加意味着调试问题将变得更加困难&#xff0c;并且需要付出额外的努力才能在所有分布式程序上启用可观察性。 监视&#xff0c;日志记录和分布式跟踪是揭示系统内部状态并提供可观察性的关键方法。 通过这三种方法将自己暴露在各种外部系统中&#xff0c;Ballerina可以完全观察到。
这有助于监视指标&#xff0c;例如请求计数和响应时间统计信息&#xff0c;分析日志以及执行分布式跟踪。 可以在以下指南中找到有关Ballerina可观察性的更多见解&#xff1a;
即将推出的功能
Ballerina的目标是成为一种编程语言和一个平台&#xff0c;通过共同设计&#xff0c;以使企业集成更加简单&#xff0c;敏捷和DevOps友好&#xff0c;除了期望的通用功能之外&#xff0c;还包括云本机和中间件抽象。
在不久的将来&#xff0c;将通过增加对事务的支持来增强该语言的网络方面&#xff0c;这些事务包括Ballerina程序之间的分布式事务&#xff0c;流查询和锁定。
重要要点
- 数十年来&#xff0c;编程语言一直将网络简单地视为I / O源。
- Ballerina是一种运行在JVM之上的开源编程语言&#xff0c;它使用客户端对象和远程方法&#xff0c;服务和资源方法以及侦听器对网络交互进行建模&#xff0c;从而为该语言带来了不同的网络方面。
- 诸如具有内置并发性的服务之类的更高级别的类型可帮助开发人员编写服务&#xff0c;并且这种服务可以正常工作。
- 语言的语法和语义共同设计为在代码的文本表示形式和可视化表示形式的顺序图之间具有双向映射。 这样可以免费提供网络交互图。
- 网络程序需要以处理故障的方式编写。 诸如断路器&#xff0c;负载平衡&#xff0c;故障转移&#xff0c;重试和超时之类的弹性技术在Ballerina的客户端对象中是开箱即用的。
- 由于网络固有的不可靠性&#xff0c;错误是网络编程的预期部分。 Ballerina的方法是显式检查错误&#xff0c;而不是将其视为异常。
- 如果未正确检查&#xff0c;所有用户输入都可能很危险。 Ballerina的异味分析机制可帮助开发人员编写不太容易被黑客入侵的客户端和服务。
- 默认情况下&#xff0c;Ballerina通过监视&#xff0c;记录日志以及对各种外部系统的分布式跟踪来公开自身&#xff0c;从而支持可观察性。 这有助于监视度量标准&#xff0c;例如请求计数和响应时间统计信息&#xff0c;分析日志以及执行分布式跟踪。
- 即将发布的功能&#xff08;如分布式协调&#xff0c;流查询和锁定&#xff09;将增强该语言的网络方面。
翻译自: https://hackernoon.com/rethinking-programming-the-network-in-the-language-kn3z3y55
网络编程语言c语言