微服務實踐k8s&dapr開發部署實驗(1)服務調用

前置條件

dapr 自託管模式運行

新建一個webapi無權限項目

image
launchSettings.json中applicationUrl端口改成5001,如下:

"applicationUrl": "http://localhost:5001"   
//WeatherForecastController.cs更改如下
using Microsoft.AspNetCore.Mvc;

namespace backend.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

        [HttpPost(Name = "Hello")]
        public object SayHello()
        {
            return new { message = "Hello" }; //這裏返回必須是json對象,如果爲字符串,則在daprClient.InvokeMethodAsync調用時會出錯
        }
    }
}

到backend目錄運行運行下面命令:

dapr run --app-id backend --app-port 5001 dotnet run

然後運行:

dapr invoke --app-id backend --method WeatherForecast  
dapr invoke --app-id backend --method WeatherForecast --verb GET

顯示下圖表示運行成功
image

dapr服務調用

新建一個名爲front的weiapi無權限項目
launchSettings.json中applicationUrl端口改成5002,如下:

"applicationUrl": "http://localhost:5002"   

添加nuget包:Dapr.Client
修改WeatherForecastController.cs如下:

using Dapr.Client;
using Microsoft.AspNetCore.Mvc;

namespace front.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {

        [HttpPost(Name = "Hello")]
        public async Task<string> HelloAsync()
        {
            var appId = "backend";
            var methodName = "WeatherForecast";

            using (var daprClient = new DaprClientBuilder().Build())
            {
                try
                {
                    var result = await daprClient.InvokeMethodAsync<object>(HttpMethod.Post, appId, methodName);
                    Console.WriteLine(result);
                    return result.ToString();
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"An exception occurred while invoking method: '{methodName}' on app-id: '{appId}'");
                    Console.WriteLine(ex.ToString());
                }
            }
            return "Error!";
        }
    }
}

訪問http://http://localhost:5002/swagger/頁面運行如下就成功了
image

k8s&dapr模式運行

Dapr uninstall --all
dapr init -k

新增docker支持
image

添加backend的k8s配置文件dapr-backend.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: dapr-deploy-backend
  labels:
    service: backend
spec:
  replicas: 2
  selector:
    matchLabels:
       service: backend
  template:
    metadata:
      labels:
        service: backend
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "backend" #這裏要注意app-id要與front調用的名稱要一致
        dapr.io/app-port: "8080"
        #dapr.io/config: "dapr-config"
    spec:
      containers:
        - name: daprbackend
          image: daprbackend
          imagePullPolicy: Never
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: daprbackend
  labels:
    service: backend
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30003
      protocol: TCP
      name: http
    - port: 50001
      targetPort: 50001
      nodePort: 30042
      protocol: TCP
      name: dapr-grpc
  selector:
    service: backend

添加backend的k8s配置文件dapr-backend.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: dapr-deploy-front
  labels:
    service: front
spec:
  replicas: 1
  selector:
    matchLabels:
       service: front
  template:
    metadata:
      labels:
        service: front
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "front"
        dapr.io/app-port: "8080"
        #dapr.io/config: "dapr-config"
    spec:
      containers:
        - name: daprfrontend
          image:  daprfrontend
          imagePullPolicy: Never
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: daprfrontend
  labels:
    service: front
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30002
      protocol: TCP
      name: http
    - port: 50001
      targetPort: 50001
      nodePort: 30041
      protocol: TCP
      name: dapr-grpc
  selector:
    service: front

啓動批處理文件start-all.bat

docker build -t daprbackend -f backend/Dockerfile .
docker build -t daprfrontend -f front/Dockerfile .

Dapr uninstall --all
dapr init -k
kubectl apply -f k8s/dapr-backend.yaml
kubectl apply -f k8s/dapr-front.yaml

pause

停止批處理文件stop-all.bat

kubectl delete -f ./k8s/dapr-front.yaml 
kubectl delete -f ./k8s/dapr-backend.yaml 
	
Dapr uninstall --all

pause

運行成功驗證

image
image
訪問http://localhost:30002/swagger/index.html
顯示如下說明已經成功
image

項目源碼下載

項目源碼下載

常用命令

dapr uninstall
Dapr uninstall --all
dapr init
dapr init -k
dapr run --app-id myapp --dapr-http-port 3500 --dapr-grpc-port 50001 -- dotnet run   #運行.net項目
dapr run --app-id backend --app-port 5001 dotnet run
dapr invoke --app-id backend --method WeatherForecast  #調用接口
dapr invoke --app-id backend --method WeatherForecast --verb GET

相關文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章