Asp.NetCore-gRPC简单使用
1、安装依赖对于 asp.net core 服务端项目安装以下即可,Grpc.AspNetCore 元包中包含对 Grpc.Tools 的引用。 服务器项目可以使用 Visual Studio 中的包管理器或通过将 Grpc.AspNetCore 添加到项目文件来添加<PackageReference>:
1<PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
客户端项目应直接引用 Grpc.Tools 以及使用 gRPC 客户端所需的其他包。 运行时不需要工具包,因此依赖项标记为 PrivateAssets="All":
123456<PackageReference Include="Google.Protobuf" Version="3.18.0" /><PackageReference Include="Grpc.Net.Client" Ver ...
RabbitMQ-发布者确认
1、发布者确认用法开启发布者确认功能发布者确认是 RabbitMQ 对 AMQP 0.9.1 协议的扩展,因此默认情况下未启用。发布者确认可以通过以下CreateChannelOptions类在通道级别启用:
12345var channelOpts = new CreateChannelOptions( publisherConfirmationsEnabled: true, publisherConfirmationTrackingEnabled: true, outstandingPublisherConfirmationsRateLimiter: new ThrottlingRateLimiter(MAX_OUTSTANDING_CONFIRMS));
发布消息并等待通过await请求返回的任务来等待消息确认BasicPublishAsync。 await一旦消息被确认,该任务就会立即返回。如果消息被拒绝或被退回(意味着代理由于某种原因无法处理该消息),该方法将抛出异常。异常处理通常包括记录错误消息和/或重试发送消息。
12345678910111 ...
RabbitMQ-主题
直连交换机虽然可以根据路由键来实现消息分发,但是其分发形式比较死板,必须要路由键完全匹配才行,那有没有可以更方便分发的交换机?有的兄弟,主题(topic)交换机可以解决这个问题
主题交换机可以这样绑定路由键:*.orange.*、*.*.rabbit…..
其中 *表示一个单词,#表示 0 个或更多个单词
直接看代码,当我们的日志系统需要根据日志级别往消息队列中推送,我们可以使用 <设施名>.<日志级别>来作为路由键
123456789101112131415161718using RabbitMQ.Client;using System.Text;var factory = new ConnectionFactory { HostName = "localhost" };using var connection = await factory.CreateConnectionAsync();using var channel = await connection.CreateChannelAsync();await ...
RabbitMQ-路由
基本知识路由的作用是在交换机的基础上将消息的分发继续细分,实现让消息的接受者只订阅消息的一部分内容
在交换机章节,我们使用了 QueueBindAsync 绑定了队列和交换机,这个函数还可以指定 routingKey 来指定路由
路由键的含义取决于交换机类型。我们之前使用的“分发”交换类型则根本不考虑其值。
直连交换机
直连交换器背后的路由算法很简单——消息会发送到绑定键与消息路由键完全匹配的队列
带有标签“orange”的消息进入第一个队列,带有标签“black”和“green”的消息会进入第二个队列,其他消息会被丢弃
多个队列绑定相同的路由键也是可以的,这样就会变成一种分发模式
消息发布1234567891011121314151617using RabbitMQ.Client;using System.Text;var factory = new ConnectionFactory { HostName = "localhost" };using var connection = await factory.CreateConnecti ...
RabbitMQ-发布订阅模式
一、交换机1、 交换机的作用在 RabbitMQ 的发布/订阅模式下,其核心思想是:生产者绝不会直接将消息发送到队列中。实际上,很多时候生产者甚至都不知道消息是否会送达任何队列。 相反,生产者只能向一个交换机发送消息。交换机是一个非常简单的概念。一方面,它接收来自生产者的消息;另一方面,它将这些消息推送到队列中。交换机必须清楚地知道如何处理它接收到的消息。该消息是否应添加到特定的队列中?是否应添加到多个队列中?还是应该将其丢弃?这些规则由交换机的类型来定义。
交换机有:direct、topic、headers、fanout 类型
2、广播型交换机会将消息进行广播,它会将消息分发到所有绑定此交换机的队列
示意图
消息发布消息发布者无需知道任何队列,只需要将消息交给交换机,由交换机决定传给哪个队列
123456789101112131415161718192021using RabbitMQ.Client;using System.Text;var factory = new ConnectionFactory { HostName = "localhos ...
RabbitMQ-基本使用
消息发布者消息发布者需要注意:
设置 queue 为持续且关闭自动删除
发送消息时配置属性为持久且设置为强制
1234567891011121314151617181920212223242526using RabbitMQ.Client;using System.Text;var factory = new ConnectionFactory { HostName = "localhost" };using var connection = await factory.CreateConnectionAsync();using var channel = await connection.CreateChannelAsync();await channel.QueueDeclareAsync(queue: "task_queue", durable: true, exclusive: false, autoDelete: false, arguments: n ...
Asp.NetCore-自定义请求处理
1、 自定义请求处理先说一下目标,由于和九识无人车对接需要调用九识的接口,九识接口需要先获取 token ,所以我的想法是:
先从缓存获取 token,如果有就将 token 放到请求头中然后发送请求,没有就调用获取 token 接口
如果 token 过期了(接口返回 401)就重新调用获取 token 接口,然后重发这次失败的请求
今天对接九识 API 发现了一个使用 HttpClient 的技巧
1builder.Services.AddHttpClient("JiuShi").AddHttpMessageHandler<JiuShiApiDelegatingHandler>();// 添加http消息处理
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899 ...
Asp.NetCore-自定义鉴权逻辑
1、自定义鉴权参考文档:https://learn.microsoft.com/zh-cn/aspnet/core/security/authorization/iard?view=aspnetcore-10.0
我的想法是通过自定义特性来实现对接口鉴权,所以需要先定义一个特性
1234567891011121314using Microsoft.AspNetCore.Authorization;namespace WebApi.Attributes { public class PermissionAuthorizeAttribute : AuthorizeAttribute, IAuthorizationRequirement, IAuthorizationRequirementData { public string PermissionCode { get; set; } public PermissionAuthorizeAttribute(string permissionCode) { ...
前端知识分享-前端权限管理
前端权限控制思路界面控制登录请求中获取权限数据,根据权限展示对应菜单。
用户未登录时,手动敲入管理界面地址,需跳转到登录界面
用户已登录时,手动敲入非权限地址,需跳转 404 界面
按钮控制仅显示有权操作的按钮,或禁用无权操作的按钮
请求与响应控制对于非常规操作,如通过浏览器调试工具将某些禁用的按钮变成启用状态,此时发请求也应该被前端拦截
Vue 前端实现界面控制界面控制的实现方法是动态路由。用户登录后获取用户有权操作的菜单列表,前端在进行路由构建的时候将用户有权操作的路由添加到 vue-router 中,这样即便用户手动输入无权界面的地址也会因为没有在 vue-router 中添加该路由而返回 not found。
1、用户登录获取菜单列表
2、将用户菜单列表存储到 pinia 中
3、通过 pinia 中的数据构建菜单栏
注意事项:网页刷新后 pinia 的数据也会被刷新,如果构建菜单栏时使用的 pinia 的数据,会出现菜单无法构建的情况。
解决方式:通过将用户菜单权限信息存储在 sessionstroage 中或通过 pinia 持久化来解决
登录成功后:
123456789c ...
Vite-插件
插件Vite会在生命周期的不同阶段调用不同的插件以达到不同的目的。
vite-aliases插件作用vite-aliases插件可以帮我们自动生成别名:帮我们检测src下的目录并生成别名,省去了自己配置alias的繁琐过程。
使用1234567891011121314import { ViteAliases } from 'vite-aliases'export default defineConfig(({ command, mode }) => { return { // resolve:{ // alias:{ // "@":path.resolve(__dirname,"./src"),//用@符号表示src目录 // "@assets":path.resolve(__dirname,"./src/assets") // } ...









