tnblog
首页
视频
资源
登录

Dapr .netcore与go的方法调用

6128人阅读 2021/9/6 22:01 总访问:3467598 评论:0 收藏:0 手机
分类: 云产品

Dapr .netcore与go的方法调用


主要回顾一下dapr是如何调用方法的。这里是通过.netcore程序调用go程序中的方法。
本章代码目录:https://gitee.com/zuxiazijiahebo/daprlearning
大致流程如下:

创建.netcore Web API应用


创建时勾选上Docker的支持。


接着添加Dapr.AspNetCore包。


在Startup.cs中添加我们的Dapr客户端服务。

  1. services.AddDaprClient();


接着我们直接修改WeatherForecastController.cs类中的方法,通过sdk与http不同的方式发送消息给指定的dapr应用。

  1. [ApiController]
  2. [Route("[controller]")]
  3. public class WeatherForecastController : ControllerBase
  4. {
  5. private readonly ILogger<WeatherForecastController> _logger;
  6. private readonly DaprClient _daprclient;
  7. public WeatherForecastController(
  8. ILogger<WeatherForecastController> logger,
  9. DaprClient daprclient
  10. )
  11. {
  12. _daprclient = daprclient;
  13. _logger = logger;
  14. }
  15. [HttpGet]
  16. public string[] Get(int id)
  17. {
  18. return new string[]{ "/sdk/{id}", "/http/{id}" };
  19. }
  20. [HttpGet("/sdk/{id}")]
  21. public async Task<string> Getsdk(int id)
  22. {
  23. Console.WriteLine("sdk begin...");
  24. // 调用服务
  25. var data = new { id = id, message = "hello [SDK]" };
  26. // 调用goapp的simple方法
  27. // InvokeMethodAsync 方法参数: 应用id,应用的方法,数据
  28. await _daprclient.InvokeMethodAsync<object>("goapp", "simple", data);
  29. // 输出发送的内容
  30. string result = string.Format("send Data: {0}", data);
  31. Console.WriteLine(result);
  32. return result;
  33. }
  34. [HttpGet("/http/{id}")]
  35. public async Task<string> Gethttp(int id)
  36. {
  37. Console.WriteLine("http begin...");
  38. var client = DaprClient.CreateInvokeHttpClient(appId: "goapp");
  39. var data = new { id = id, message = "hello [http]" };
  40. // http的方式
  41. var response = await client.PostAsJsonAsync("/simple", data);
  42. string result = string.Format("send Data: {0}", data);
  43. Console.WriteLine(result);
  44. return result;
  45. }
  46. }


关于.netcore的Dockerfile

  1. FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
  5. WORKDIR /src
  6. COPY ["Client.csproj", "."]
  7. RUN dotnet restore "./Client.csproj"
  8. COPY . .
  9. WORKDIR "/src/."
  10. RUN dotnet build "Client.csproj" -c Release -o /app/build
  11. FROM build AS publish
  12. RUN dotnet publish "Client.csproj" -c Release -o /app/publish
  13. FROM base AS final
  14. WORKDIR /app
  15. COPY --from=publish /app/publish .
  16. ENTRYPOINT ["dotnet", "Client.dll"]

编写go应用程序


然后创建go目录来编写我们的go应用程序。


app.go中主要提供一个/simple的方法,并将它接收到的内容输出并打印出来。

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "io/ioutil"
  6. "net/http"
  7. "fmt"
  8. "github.com/gorilla/mux"
  9. )
  10. func simplemethod(w http.ResponseWriter, r *http.Request) {
  11. w.Header().Set("Content-Type", "application/json")
  12. w.Header().Set("Access-Control-Allow-Origin", "*")
  13. s, _ := ioutil.ReadAll(r.Body)
  14. fmt.Fprintln(w, "%s",string(s))
  15. fmt.Println(fmt.Sprintf("%s%s", "From dotnet app, data: ", string(s)))
  16. json.NewEncoder(w).Encode("go have already processed!")
  17. }
  18. func main() {
  19. router := mux.NewRouter()
  20. router.HandleFunc("/simple", simplemethod).Methods("POST", "OPTIONS")
  21. log.Fatal(http.ListenAndServe(":6000", router))
  22. }


Dockerfile如下:

  1. FROM golang:1.15-buster as builder
  2. WORKDIR /dir
  3. COPY app.go .
  4. RUN go get -d -v
  5. RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
  6. FROM debian:buster-slim
  7. WORKDIR /root/
  8. COPY --from=builder /dir/app .
  9. CMD ["./app"]


大家闲麻烦可以直接git clone https://gitee.com/zuxiazijiahebo/daprlearning.git

Dapr应用在Docker中的部署


没安装的可以参考这篇 安装Dapr
安装好后进行初始化

  1. dapr init

安装dotnetapp应用

  1. cd daprlearning/Client/Client/
  2. # 生成
  3. dotnet build
  4. # 切换到生成好的目录下
  5. cd ./bin/Debug/netcoreapp3.1
  6. # dapr开启dotnetapp应用,应用端口5000,dapr边车端口3500
  7. dapr run --app-id dotnetapp --app-port 5000 --dapr-http-port 3500 dotnet Client.dll

安装go应用

  1. cd daprlearning/Client/Client/go
  2. # 安装 gorilla/mux package
  3. go get -u github.com/gorilla/mux
  4. # 生成 go 程序
  5. go build app.go
  6. # dapr 启动go程序
  7. dapr run --app-id goapp --app-port 6000 --dapr-http-port 3501 ./app

测试


我们通过如下几次请求来测试应用程序的调用情况

  1. # 查看dotnetapp应用的两个接口
  2. curl http://127.0.0.1:5000/weatherforecast
  3. # 开始调用
  4. curl http://127.0.0.1:5000/sdk/1
  5. curl http://127.0.0.1:5000/http/2
  6. # Dapr CLI的方式测试
  7. dapr invoke --app-id goapp --method simple --data "{\"data\": { \"orderId\": \"42\" } }"


我们可以通过查看go应用的运行记录查看调用情况。


接着我们到zipkin中查看更详细的调用情况
访问http://localhost:9411


我们可以看到它是调用的都是该地址:POST {dapr url}/v1.0/invoke/{app-id}/method/{method}
下面是链路情况:

Dapr应用在k8s中的部署

  1. # 初始化
  2. dapr init -k


所有的部署都在Deploy目录下,镜像我也为大家打包好了。所以可以直接切换到Deploy目录下按照如下方式进行部署。

安装redis


我这里redis部署得很简单大家搞集群的话也是可以的。

  1. docker pull redis:latest
  2. docker run -itd --name redis-test -p 6379:6379 redis


查看ifconfig修改一下redis.yaml的host地址

安装项目

  1. kubectl apply -f .
  2. # 查看Pod状态
  3. kubectl get pod -w


稍等几分钟就好。


进行端口代理,然后打开一个新的Session执行下面命令进行测试

  1. kubectl port-forward --address 0.0.0.0 service/dotnetclient 8080:80
  1. curl http://127.0.0.1:8080/weatherforecast
  2. # 开始调用
  3. curl http://127.0.0.1:8080/sdk/1
  4. curl http://127.0.0.1:8080/http/2


没有输出的原因是因为镜像没有更新你们不会出现这种问题的。下面是go的日志记录情况:


待续…


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

分布式服务架构微服务架构概念的区别联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

jsController中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

Service-stack.redis配置连接池读写分离(处理并发相关等)

配置连接池与读写分类 //写节点(主节点) List&lt;string&gt;writes=newList&lt;string&gt;(); writes.Add(&quot;123456a...

CSS相对定位绝对定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

C委托事件

1.什么是委托?  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是...

asp.net core2.0 依赖注入 AddTransientAddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

Vue.js+Layer实现表格数据绑定更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

下划线、换行、回车、空格ASCII码值对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

数据读取器指定的"xx"不兼容。某个类型为"xx"的成员在同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery&lt;SMachine&gt;(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

git 下载提交命令

一.先使用git clone下载一个项目 git clone &#39;项目地址&#39; 这里要注意: clone的项目里边会自带git的一些信息,...

微信开发四 接受用户普通消息回复消息

微信接收用户普通消息的文章可以在官方中直接看微信普通消息分类:接受用户文本消息 与 回复文本信息 注意在接收用户普通...

记忆糖的关系【阅读听力】

Link Between Memory and SugarSugar On The BrainIt’s long been understood that there is a connection between memory...

婚姻心脏健康的关系【阅读听力】

Marriage and Heart HealthPlenty of studies have found that being married is generally good for health. One study ze...

iframe自适应高度配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core中使用url编码解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

Sqlerver添加用户授权

添加用户安全性--&gt;登录名,然后右键新建登录名就可以了然后填写好相关信息就可以了右键属性,用户映射可以选择该用户可...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术