文章目录

  • 项目地址
  • 一、异常处理
    • 1.1 自定异常
    • 1.2 自定义异常处理中间件
    • 1.3 注册中间件
  • 二、grpc服务
    • 2.1 创建protos
      • 1. 打折的protos
      • 2. 设置grpc server
      • 3. program配置服务
      • 4. docker-compose
    • 2.2 CRUD
      • 1. 查询
    • 2.3 测试
      • 1. 发起查询请求
  • 三、grpc服务消费
    • 3.1 创建client
      • 1. 添加服务
      • 2. 选择需要添加的服务类型
      • 3. 选择服务路径
      • 4. 添加成功后
      • 5. Program里添加Client服务
      • 6. appSettings里添加grpc服务地址
    • 3.2 grpc通讯
      • 1. 在StoreBasketCommandHandler使用


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、异常处理

1.1 自定异常

  • BadRequestException
  • InternalServerException
  • NotFoundException

在这里插入图片描述

1.2 自定义异常处理中间件

  • 异常处理中间件
public class CustomExceptionHandler(ILogger<CustomExceptionHandler> logger): IExceptionHandler
{public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken){logger.LogError("Error Message: {exceptionMessage}, Time of occurrence {time}",exception.Message, DateTime.UtcNow);(string Detail, string Title, int StatusCode) details = exception switch{InternalServerException =>(exception.Message,exception.GetType().Name,context.Response.StatusCode = StatusCodes.Status500InternalServerError),ValidationException =>(exception.Message,exception.GetType().Name,context.Response.StatusCode = StatusCodes.Status400BadRequest),BadRequestException =>(exception.Message,exception.GetType().Name,context.Response.StatusCode = StatusCodes.Status400BadRequest),NotFoundException =>(exception.Message,exception.GetType().Name,context.Response.StatusCode = StatusCodes.Status404NotFound),_ =>(exception.Message,exception.GetType().Name,context.Response.StatusCode = StatusCodes.Status500InternalServerError)};var problemDetails = new ProblemDetails{Title = details.Title,Detail = details.Detail,Status = details.StatusCode,Instance = context.Request.Path};problemDetails.Extensions.Add("traceId", context.TraceIdentifier);if (exception is ValidationException validationException){problemDetails.Extensions.Add("ValidationErrors", validationException.Errors);}await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);return true;}
}
  • 返回例
{"title": "ValidationException","detail": "参数验证失败","status": 400,"instance": "/api/products","traceId": "00-9d4a78437e-abc123def456-01","ValidationErrors": [{"PropertyName": "Name","ErrorMessage": "Name 不能为空"},{"PropertyName": "Age","ErrorMessage": "Age 必须大于 0"}]
}

1.3 注册中间件

  • 给所有微服务注册
    在这里插入图片描述

二、grpc服务

土耳其146

  • 这里主要实现了discount模块的grpc,我们可以通过api进行增删改查

2.1 创建protos

在这里插入图片描述

1. 打折的protos

  • 定义请求和返回值
syntax = "proto3";option csharp_namespace = "Discount.Grpc";package discount;// The discount service definition.
service DiscountProtoService {// Discount CRUD Operationsrpc GetDiscount (GetDiscountRequest) returns (CouponModel);rpc CreateDiscount (CreateDiscountRequest) returns (CouponModel);rpc UpdateDiscount (UpdateDiscountRequest) returns (CouponModel);rpc DeleteDiscount (DeleteDiscountRequest) returns (DeleteDiscountResponse);
}message GetDiscountRequest {string productName = 1;
}message CouponModel {int32 id = 1;string productName = 2;string description = 3;int32 amount = 4;
}message CreateDiscountRequest {CouponModel coupon = 1;
}message UpdateDiscountRequest {CouponModel coupon = 1;
}message DeleteDiscountRequest {string productName = 1;
}message DeleteDiscountResponse {bool success = 1;
}

2. 设置grpc server

  • 设置grpc服务
    在这里插入图片描述
  • 设置成功后,可以在模块的包管理器看到

在这里插入图片描述

3. program配置服务

在这里插入图片描述

4. docker-compose

在这里插入图片描述

2.2 CRUD

在这里插入图片描述

1. 查询

在这里插入图片描述

2.3 测试

1. 发起查询请求

在这里插入图片描述

三、grpc服务消费

土167

  • Basket.Api 服务调用Discount.Grpc服务

3.1 创建client

  • Basket服务要去调用Discount服务,所以Basket是 Client, Discount是 service

1. 添加服务

在这里插入图片描述

2. 选择需要添加的服务类型

在这里插入图片描述

3. 选择服务路径

在这里插入图片描述

4. 添加成功后

  • 添加成功后,basket模块会有Protos文件夹
    在这里插入图片描述

5. Program里添加Client服务

  • 在Basket模块的Program里添加
    在这里插入图片描述

6. appSettings里添加grpc服务地址

  • 添加Grpc的服务地址
    在这里插入图片描述

3.2 grpc通讯

1. 在StoreBasketCommandHandler使用

  • 在StoreBasketCommandHandler里进行折扣服务的扣减
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915324.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915324.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915324.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BLIP、InternVL Series(下)

目录 一、InternVL1.5 1、改进 二、InternVL2 1、渐进式扩展 2、多模态扩展 三、InternVL2.5 1、方法 2、数据优化 四、InternVL3 2、方法 3、训练后处理 4、测试时扩展 五、BLIP-3o 一、InternVL1.5 1、改进 InternVL1.5在InternVL基础上&#xff0c;优化了QLLa…

【数据结构】二维差分数组

题目链接 【模板】二维差分_牛客题霸_牛客网 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推&#xff0c;求职就业一站解决_牛客网 描述 给定一个 nmnm 的整数矩阵 bb&#xff0c;矩阵的下标从 11 开始记作 bi,jbi,j​。现在需要支持 qq 次操作&#xff0c;第 tt 次…

【JDK内置工具】常用工具和实战指令

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 关键词: #JDK工具 #Java性能调优 #JVM调优 #内存泄漏排查 #线程死锁分析 #Java开发工具 #线上问题排查 #Java诊断工具 Hello&#xff0c;大家好&#xff0c;我是爱学习的唐叔。作为Java开发者&#xff0c;JDK内置工…

一站式PDF转Markdown解决方案PDF3MD

简介 什么是 PDF3MD &#xff1f; PDF3MD 是一个现代化、用户友好的网络应用程序&#xff0c;旨在将 PDF 文档转换为干净、格式化的 Markdown 文本。它提供了高效的转换工具&#xff0c;支持多种文件格式之间的转换。 主要特点 PDF 转 Markdown&#xff1a;能够将 PDF 文档转…

RocketMQ学习系列之——MQ入门概念

一、什么是MQMQ&#xff08;Message Queue&#xff0c;消息队列&#xff09;是一种能够实现跨进程消息传输&#xff0c;并且消息缓存符合队列特性的组件。二、MQ的作用异步&#xff1a;消息发送方无需等待消息接收方收到消息&#xff0c;发送方将消息成功发送到 MQ 之后即可无阻…

血条识别功能实现及原理

从零开始学Python图像处理 - 血条识别 从实际问题中能快速的学习特定技能&#xff0c;通过完成一个能自动刷怪的工具&#xff0c;达成快速学习python图像处理和识别。 自动刷怪需要先识别怪物&#xff0c;在游戏中怪物类型很多&#xff0c;同时在移动中形态会一直发生变化&…

网络地址和主机地址之间进行转换的类

#pragma once #include "Common.hpp" // 网络地址和主机地址之间进行转换的类class InetAddr { public:InetAddr(){}InetAddr(struct sockaddr_in &addr) : _addr(addr){// 网络转主机_port ntohs(_addr.sin_port); // 从网络中拿到的&#xff01;网络序列// _i…

《Python 项目 CI/CD 实战指南:从零构建自动化部署流水线》

🛠《Python 项目 CI/CD 实战指南:从零构建自动化部署流水线》 一、引言:为什么 Python 项目需要 CI/CD? 在现代软件开发中,CI/CD(持续集成 / 持续部署)已成为不可或缺的工程实践。它不仅提升了开发效率,还显著降低了部署风险。对于 Python 项目而言,CI/CD 的价值尤…

AJAX 技术

AJAX全称是 Asynchronous JavaScript and XML ( 异步的JavaScript 和 XML )&#xff0c;使用该技术后&#xff0c;可以实现不刷新整个网页&#xff0c;与服务器进行异步通信并更新部分网页。一&#xff09;为什么需要AJAX?传统网页在与服务器通信时&#xff0c;需要刷新整个页…

Python爬虫实战:研究NLTK库相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络新闻已成为人们获取信息的主要来源之一。每天产生的海量新闻文本蕴含着丰富的信息和知识,但也给信息获取和分析带来了挑战。如何从大量非结构化的新闻文本中自动提取有价值的信息,识别热点话题和趋势,成为当前自然语…

ARM 学习笔记(二)

参考文献&#xff1a;《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》1、MMU 1.1 背景早期的内存是比较小的&#xff0c;一般是几十k&#xff0c;不过相应的程序也是比较小的&#xff0c;这时程序可以直接加载到内存中运行。后来为了支持多个程序的并行&…

Github 贪吃蛇 主页设置

自动化脚本顶部元信息触发条件&#xff08;on:&#xff09;作业&#xff08;jobs:&#xff09;步骤&#xff08;steps:&#xff09;1. 生成 SVG2. 推送到 output 分支Commit & Push在 README 里引用参考&#xff1a;https://github.com/Platane/Platane/tree/master 首先写…

关于Spring RestTemplate

​ 一、概述RestTemplate 是 Spring Framework 提供的一个同步 HTTP 客户端工具&#xff0c;用于简化与 RESTful API 的交互。它封装了底层 HTTP 通信细节&#xff0c;提供了统一的 API 来发送各种 HTTP 请求&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并自…

异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql

设计准则“为什么要考虑这个问题”The forward logic is only about 10% of your code, everything else is 90%.主流逻辑 10%保障扩容和稳健的代码设计90%同步代码就是绑在一个绳上的蚂蚱异步就是实现了解耦这个异步或许有点类似于--一些分布式数据的处理 设计如何实现的呢?…

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

系列文章 序号 文章名称 1 Spring AI 项目实战(一):Spring AI 核心模块入门 2 Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码) 3 Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码) 4

指针数组和数组指针的应用案例

1. 指针数组应用&#xff1a;查找最长字符串用指针数组存储若干字符串&#xff0c;编写函数找出其中最长的字符串&#xff08;若有多个&#xff0c;返回第一个&#xff09;。#include <stdio.h> #include <string.h>// 函数原型&#xff1a;找出最长字符串 const c…

MCU进入低功耗模式前的引脚处理原则和方法 --> 以最小化低功耗电流

在MCU进入低功耗模式(如Sleep, Stop, Standby, Deep Sleep等)前,精心处理每一个GPIO引脚的状态是最大限度降低功耗电流的关键一步。悬空或配置不当的引脚是导致“漏电”的常见原因。以下是处理引脚以达到最小低功耗电流的原则和方法: 📌 核心原则 避免浮空输入: 浮空(…

张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;

关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导; 目录 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导; 一、校准方法:让模型概率更贴近真实正确…

ICT测试原理之--什么是假短

ICT测试原理之–什么是假短 文章目录ICT测试原理之--什么是假短一、假短的由来防止假短二、无法检测的短路示例解决无法检测的短路调试短路文件调试意外断路调试意外短路三、调试假短报告短路和断路报告假短报告短路设备/引脚功能性短路测试功能性短路测试的语法一、假短的由来…

三种深度学习模型(LSTM、CNN-LSTM、贝叶斯优化的CNN-LSTM/BO-CNN-LSTM)对北半球光伏数据进行时间序列预测

代码功能 该代码实现了一个光伏发电量预测系统&#xff0c;采用三种深度学习模型&#xff08;LSTM、CNN-LSTM、贝叶斯优化的CNN-LSTM&#xff09;对北半球光伏数据进行时间序列预测&#xff0c;并通过多维度评估指标和可视化对比模型性能。 算法步骤 1. 数据预处理 数据导入&am…