如果dapr的各个服务部署在同一个子网内的不同机器上,默认服务发现和配置是通过mdns来实现的,但微服务实际部署可能会跨网段服务部署在不同子网内的不同服务器上,这个时候服务注册和发现机制就需要引入外部服务注册发现中心来实现。本文主要介绍基于consul服务注册和发现中心的本地dapr开发环境的配置。其中服务端实现了golang的GRPC服务,客户端为了方便调试,实现了python SDK的服务调用。
一、本地安装dapr
- 按照官方文档安装dapr cli
- 建议在本地使用
dapr init --slim
模式安装dapr运行时
二、配置consul注册中心
首先参考dapr基于consul的服务注册配置配置好consul服务注册中心
三、生成微服务项目并配置golang服务端
这里推荐通过如下方式使用hdkit生成dapr项目代码模板
- 编写微服务的protobuf文件
- 基于protobuf文件使用hdkit生成dapr微服务代码模板
hdkit new dapr
-p - 修改
<project>/service
目录下的代码实现业务逻辑 - 修改
<project>/setting/dapr/config.yaml
文件添加consul注册配置apiVersion: dapr.io/v1alpha1 kind: Configuration metadata: name: appconfig spec: nameResolution: component: "consul" configuration: selfRegister: true
- 下载consul windows版本并运行
这里192.168.51.5是本地开发机器的ip地址,该地址要能够访问到consul注册中心192.168.52.2consul agent --data-dir d:\consul -bind 192.168.51.5 -join 192.168.52.2
-
运行微服务
-
http模式运行微服务
dapr run --app-id httpGrpcServer --app-protocol http --app-port 8888 --metrics-port 9999 --config setting/dapr/config.yaml --components-path setting/dapr/components -- go run main.go run http -e local
-
grpc模式运行微服务
dapr run --app-id exampleGrpcServer --app-protocol grpc --app-port 8888 --metrics-port 9999 --config setting/dapr/config.yaml --components-path setting/dapr/components -- go run main.go run grpc -e local
-
这个时候我们访问注册中心的web页面应该就可以看到exampleHttpServer或者exampleGrpcServer已经注册成功
四、编写python客户端
-
首先在本地环境安装python3,注意请安装python3.7以上
-
安装dapr python sdk
pip3 install dapr dapr-ext-grpc
-
编写python客户端程序,例如:
from dapr.clients import DaprClient with DaprClient() as d: # invoke a method (gRPC or HTTP GET) resp = d.invoke_method('hduc', 'authenticate', data='{"message":"Hello World"}') print(resp.data)
-
将服务端
<project>/setting/dapr
目录下的所有配置连同目录拷贝到python客户端的项目目录下,修改config.yaml
文件添加consul注册配置apiVersion: dapr.io/v1alpha1 kind: Configuration metadata: name: appconfig spec: nameResolution: component: "consul" configuration: selfRegister: false
注意:因为client在调用一次后就会退出,这里可以将selfRegister设置为false
-
运行客户端
dapr run --app-id client --config config.yaml --components-path components -- python client.py