您的位置 首页 golang

dapr实战(2):使用go和java来实现dapr 官方的Hello world和对其过程的研究


引言

在前面上一次的实战中,我们搭建了dapr的本地开发环境,并且部署了dapr官方的Hello World示例代码,为了加深对Dapr的理解,在本文中使用go 和 java语言重写Dapr的官方示例代码

Dapr的官方示例代码Hello World的分析

dapr实战(2):使用go和java来实现dapr 官方的Hello world和对其过程的研究
dapr示例

在服务端中提供了三个对Order的处理逻辑:增加订单,查询订单和删除订单,这三个业务处理都是以REST的方式对外提供服务,而这三个业务处理都会通过Dapr Runtime与Redis交互来完成数据的存放,读取和删除;而python所开发的客户端,周期的通过Dapr Runtime去调用服务端的增加订单的接口

官方示例代码重新实现

服务端的代码分为两个部分:提供的REST服务 和 访问Redis,后面将对这两个部分进行分析

使用golang实现服务端

提供REST服务

REST服务这部分的开发与一般的rest服务的开发并没有什么不同之处,所以在这里我选择自己比较熟悉的echo框架作为了开发框架,分别开发了order的增查删的接口,代码如下:
路由注册部分,完整代码参考

    e := echo.New()    e.POST("/neworder", orderResource.Neworder)    e.GET("/order", orderResource.Queryorders)    e.DELETE("/order/:id", orderResource.DeleteOrder)

REST请求处理部分,完整代码参考

func (o *OrderResource) Neworder(c echo.Context) error {    data := &Data{}    err := c.Bind(data)    if err != nil {        return err    }    err = o.cache.Add(data)    if err != nil {        return c.String(500, err.Error())    }    return c.String(200, "add success")}func (o *OrderResource) Queryorders(c echo.Context) error {    data, err := o.cache.Query()    if err != nil {        return c.String(500, err.Error())    }    return c.JSON(200, data)}func (o *OrderResource) DeleteOrder(c echo.Context) error {    id := c.Param("id")    err := o.cache.delete(id)    if err != nil {        return c.String(500, err.Error())    }    return c.String(200, "delete success")}

在这里需要关注的一点就是在这里注册的path和访问这个rest接口的path还是有所不同,通过Dapr来访问时,还需要增加http://xxxx:<DAPR_HTTP_PORT>/v1.0/invoke/<APP_ID>/method/<Method> 来访问才行,如下:

http://localhost:3500/v1.0/invoke/nodeapp/method/neworder

访问redis

要通过Dapr runtime去访问redis服务,必须按照Dapr的state规范来实现(注:Dapr中所涉及到的规范,将在以后的文章中来进行介绍)
相关代码如下,完整代码请参考

func (cache *CacheService) Add(data *Data) error {    request := cache.httpclient.Post()    request.Path(cache.stateUrl)    state := &State{        Key:   "order",        Value: data,    }    states := []*State{state}    response, err := request.JSON(&states).Send()    if err != nil {        return err    }    if !response.Ok {        return fmt.Errorf("add state error,statuCode:%d,messag:%s", response.StatusCode, response.String())    }    log.Info("Successfully persisted state.")    return nil}func (cache *CacheService) Query() (*Data, error) {    request := cache.httpclient.Get()    request.Path(cache.stateUrl + "/order")    response, err := request.Send()    if err != nil {        return nil, err    }    if !response.Ok {        return nil, fmt.Errorf("query state error,statuCode:%d,messag:%s", response.StatusCode, response.String())    }    data := &Data{}    err = response.JSON(&data)    return data, err}func (cache *CacheService) delete(id string) error {    request := cache.httpclient.Delete()    request.Path(cache.stateUrl + "/" + id)    request.AddHeader("Content-Type", "application/json")    response, err := request.Send()    if err != nil {        return err    }    if !response.Ok {        return fmt.Errorf("delete state error,id:%s,statuCode:%d,messag:%s", id, response.StatusCode, response.String())    }    return nil}

使用java实现客户端

相关代码如下,完整代码参考

public class DaprHelloworldClientApplication {    private final static String bodyTmpl="{"data": {"orderId": "%s"}}";    public static void main(String[] args) throws IOException, InterruptedException {        Thread sendThread = new Thread(new Runnable() {            public void run() {                int i=0;                while(!Thread.interrupted()){                    try {                        Thread.sleep(5000);                        i++;                        String body=String.format(bodyTmpl,String.valueOf(i));                        sendRequest(body);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        });        sendThread.start();        Thread.sleep(5*60*60*1000);    }    public static void sendRequest(String body) throws IOException {    String httpPort = System.getenv("DAPR_HTTP_PORT");    if (httpPort == null) {        httpPort = "3500";    }    String resultUrl = "http://localhost:" + httpPort + "/v1.0/invoke/goapp/method/neworder";    URL url = new URL(resultUrl);    HttpURLConnection connection = (HttpURLConnection) url.openConnection();    connection.setRequestMethod("POST");    connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");    connection.setRequestProperty("Connection", "Keep-Alive");    connection.setUseCaches(false);    connection.setDoOutput(true);    connection.setDoInput(true);    System.out.println("request body:"+body);    DataOutputStream out = new DataOutputStream(connection.getOutputStream());    out.write(body.getBytes("UTF-8"));    out.flush();    out.close();    connection.connect();    BufferedReader bReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));    String line, resultStr = "";    while (null != (line = bReader.readLine())) {        resultStr += line;    }    System.out.println(resultStr);    bReader.close();}}

在上面的代码中,比较特殊的情况是其访问服务端REST的URL是:"http://localhost:" + httpPort + "/v1.0/invoke/goapp/method/neworder"

小结

从上面的代码看来使用Drap后,REST的开发并没有变的麻烦,并且访问Redis的代码还更加的简洁,不在需要使用特定的redis客户端,这样降低了业务开发人员的学习成本,向着云原生又迈进的一步

部署程序

用于使用java开发,所以整个系统都使用maven来进行编译,当然在

启动服务端

dapr run --app-id goapp --app-port 3000 --port 3500 ./helloworld-serverℹ️  Starting Dapr with id goapp. HTTP Port: 3500. gRPC Port: 39669== APP ==== APP ==    ____    __== APP ==   / __/___/ /  ___== APP ==  / _// __/ _ / _ == APP == /___/__/_//_/___/ v4.1.16== APP == High performance, minimalist Go web framework== APP == https://echo.labstack.com== APP == ____________________________________O/_______== APP ==                                     O== APP == ⇨ http server started on [::]:3000

启动客户端

 dapr run --app-id javaapp `java -jar dapr-helloworld-client-0.0.1-SNAPSHOT-jar-with-dependencies.jar`

在启动客户端后,可以在服务端的终端上看到如下的代码输出:

== APP == {"time":"2020-06-01T07:25:37.690025853-04:00","level":"INFO","prefix":"-","file":"cache_service.go","line":"48","message":"Successfully persisted state."}== APP == {"time":"2020-06-01T07:25:42.712922528-04:00","level":"INFO","prefix":"-","file":"cache_service.go","line":"48","message":"Successfully persisted state."}== APP == {"time":"2020-06-01T07:25:47.725423292-04:00","level":"INFO","prefix":"-","file":"cache_service.go","line":"48","message":"Successfully persisted state."}

总结

通过用java和golang开发了官方的实例代码,个人感觉dapr对代码的限制比较少,开发难度不大,在后面的实战中,将试试在Kubernetes来部署Dapr

dapr实战(2):使用go和java来实现dapr 官方的Hello world和对其过程的研究
微信公众号

文章来源:智云一二三科技

文章标题:dapr实战(2):使用go和java来实现dapr 官方的Hello world和对其过程的研究

文章地址:https://www.zhihuclub.com/2406.shtml

关于作者: 智云科技

热门文章

评论已关闭

11条评论

  1. cialis traitement quotidien Hckemb [url=https://newfasttadalafil.com/]cialis online india[/url] Tgtiyo Iyaadh Buying Clobetasol – cialis Kiuydl

  2. The protein band intensities were evaluated using Amersham ECL Western Blotting Detection System GE Healthcare Life Sciences and were normalized to housekeeping genes, either ОІ actin or HSP90 In several cell models, it has been observed that at physiological concentrations, T4 is more active than T3 at stimulating the MAPK pathway 84, 85, 86, 87

  3. Exklusiv: Entdecke den ultimativen “Reduslim Cocktail” – Dein Schlüssel
    zur Traumfigur!

    Träumst du davon, in kurzer Zeit ein paar überflüssige Pfunde loszuwerden und gleichzeitig
    deinen Stoffwechsel anzukurbeln? Dann ist der “Reduslim Cocktail” die perfekte Lösung für dich!
    Dieses revolutionäre Produkt hat das Potenzial, deine Gewichtsabnahme zu beschleunigen und dir zu einem gesünderen, aktiveren Lebensstil zu
    verhelfen.

    Der “Reduslim Cocktail” ist ein exklusives Getränk, das aus natürlichen Inhaltsstoffen hergestellt wird und dein Gewichtsverlustprogramm unterstützt.
    Seine kraftvolle Formel enthält eine einzigartige Kombination aus
    hochwertigen Zutaten, die gezielt auf deinen Stoffwechsel
    abzielen und dabei helfen, überschüssiges Fett zu verbrennen.

    Dieser erfrischende Cocktail liefert nicht nur wichtige Nährstoffe, sondern wirkt auch als natürlicher Appetitzügler, der Heißhungerattacken bekämpft und somit das Verlangen nach ungesunden Snacks verringert.
    Mit dem “ Cocktail” fühlst du dich satt und zufrieden, ohne unnötige Kalorien zu dir zu nehmen.

    Neben seiner schlankmachenden Wirkung bietet der “Reduslim Cocktail” auch zahlreiche weitere gesundheitliche Vorteile. Durch seine antioxidative Wirkung schützt er deine Zellen vor Schäden durch freie Radikale und unterstützt somit auch dein Immunsystem. Außerdem fördert er die Entgiftung deines Körpers und sorgt dafür, dass du dich energiegeladen und vital fühlst.

    Die Anwendung des “Reduslim Cocktails” ist denkbar einfach. Du musst einfach nur einen Teelöffel des Pulvers in ein Glas Wasser geben und gut umrühren. Du kannst es sowohl morgens als auch abends genießen und es zu deinem täglichen Ritual machen. Mach einen gesunden Lifestyle zu deiner Priorität und erlebe die fantastischen Ergebnisse!

    Stelle dir vor, wie du in kurzer Zeit ein neues, selbstbewusstes Ich präsentieren kannst. Mit dem “Reduslim Cocktail” erhältst du ein mächtiges Werkzeug in die Hand, um endlich deine Wunschfigur zu erreichen. Worauf wartest du noch? Bestelle noch heute deine erste Packung und mach den ersten Schritt auf dem Weg zu einem gesünderen, fitteren und glücklicheren Leben!

    Wichtig: Da der “Reduslim Cocktail” ein hochwertiges Produkt ist, das nur online erhältlich ist, solltest du sicherstellen, dass du es von der offiziellen Webseite beziehst, um qualitativ hochwertige Ergebnisse zu erzielen. Zögere nicht länger und lass den “Reduslim Cocktail” zu deinem neuen Schlüssel zur Traumfigur werden!

  4. Thanks for another informative web site. The
    place else could I get that type of info written in such an ideal method?

    I’ve a undertaking that I’m simply now working on, and I have been at the glance out for such info.

    Visit my webpage –

网站地图