基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程当中所需要的诸如 Rpc、Redis、Mysql 等需要调用的资源。 简而言之 Consul 就是根据 Key/Value 存储了一套所有服务的 IP/Port 集合,当你 Grpc 客户端需要请求某种服务的时候,具体的 IP 与端口不需要你自己来进行指定,而是通过与 Consul Agent 通信获得某个服务下面可用的 IP/Port 集合。 而 Consul 还提供了健康检查等附加的功能,你可以通过对可用服务节点的遍历来自己进行负载均衡或者服务选择。 0.2 为什么要用 Consul 没用 Consul 之前的情况是,我 new 一个 Channel 的话,需要指定 Grpc Server 的地址与端口,一单服务挂掉或者 Grpc Server 的 IP 地址或者端口有变更,那么我还得重新更改 setting 才能够使用我的服务。 使用了 Consul 之后我只需要去 Consul Agent 里面查询我指定的服务有哪些节点可用,返回给我对应的 IP 地址和端口,我就可以进行连接了。 1.准备工作 1.1 Consul 集群安装与配置 Consul 我是直接使用 Docker 的官方 Consul 镜像来进行安装的,直接执行以下命令 pull 到最新的镜像: 1 docker pull consul 拿到之后我们先运行一个服务:

利用 DynamicLinq 实现简单的动态表达式构建查询

平时使用 LINQ 进行一些简单的条件拼接查询一般都会这样操作: 1 2 3 4 5 6 public class SearchInputDto { public string ConditionA { get; set; } public int? ConditionB { get; set; } public string ConditionC { get; set; } } 这里有三个条件,是前端传入的搜索条件,然后我们来编写一个查询语句: 1 2 3 4 5 6 7 8 9 10 public Task Search(SearchInputDto input) { var queryResult = _db.Where(z=>(input.ConditionA == null || z.Name == input.ConditionA) && (input.ConditionB == null || z.Number == input.ConditionB) && (input.

使用 C# 编写自己的区块链挖矿算法

文章原文来自:Code your own blockchain mining algorithm in Go! ,原始文章通过 Go 语言来实现的,这里仍然是承接上一篇文章,来使用 C# + .Net Core 实现我们的挖矿算法。 强烈建议阅读前先阅读这篇文章 什么是加密货币挖掘? 一个加密货币的价值体现在它的稀缺性上,如果任何人都可以任意构造一个比特币,那么比特币就毫无价值,所以比特币的区块链会让参与者完成一项“工作”,根据这个工作的最终结果还分发比特币,这个过程就被叫做“挖矿”。这就类似于一个黄金矿工花一些时间来工作,然后获得一点黄金。 挖矿的原理 如果你百度/谷歌搜索 比特币挖矿的原理 的话,都会给你说是计算一个复杂的数学问题而已,但是这么说的话太笼统而且也太简单。采矿引擎如何工作这是一个重要的知识点,所以我们需要了解一些密码学知识和哈希算法相关的知识,才能知道挖矿的基本原理。 哈希/散列介绍 单向加密人类能够理解的输入,例如 Hello World ,并将其扔到某个加密函数(即所谓的复杂的数学问题),加密函数的算法越复杂,逆向工程就越困难。 例如一个 SHA - 256 的例子,**这个网站**可以很快的计算散列值,让我们来散列 “Hello World” 看看会得到什么结果: 不管你试验几次都会得到一样的散列值,在编程中这种被称之为幂等性。 加密算法的一个基本特性就是,它们很难通过逆向工程来得到明文结果,但是十分容易验证他们的加密结果,例如这里的 “Hello World” 很难通过逆向工程得到他的原明文结果,比特币采用的是 Double SHA-256 也就是将明文通过 SHA-256 计算过一次之后,再拿 SHA-256 针对散列值再次进行计算,在这里我们只使用 SHA-256 来进行加密。 工作证明 比特币通过让参与者散列随机的字母与数字的组合,直到计算出来的散列包含前导 0。 例如我们计算 886 的散列值可以得到如下结果: 1 000f21ac06aceb9cdd0575e82d0d85fc39bed0a7a1d71970ba1641666a44f530 它返回了 3 个 0 作为前缀的散列值,但是我们怎么知道 886 计算出来的散列结果产生了 3 个 0 呢? 答案是我并不需要知道。。。我需要知道矿工给我的散列值前导有几个零就好了,并不需要复杂的算法来验证整个散列值的有效性。

在 Docker 当中搭建 Docfx 站点

一、简介 Docfx 是微软开发的一款开源的文档生成工具,其默认支持 C# 与 VB.Net 这两种项目的文档生成,支持 DotNetCore 项目,并且还可以打包成一个静态的 Web 站点,而且还支持 markdown 文件。 **这个站点**就是 ImageSharp 的 API 文档,可以去参考一下。 二、安装 下载 Docfx 是即开即用的,他基于 .Net Framework 开发,所以我们可以先在 Windows 平台上面生成 API 文档试一下,DocFx 的下载地址为 https://github.com/dotnet/docfx/releases ,选择最新版本下载即可。 设置环境变量 然后解压其压缩包,因为这是一个命令行程序,所以我们可以将其目录添加到环境变量以便于我们在任何地方来使用。 按住 Shift 键再点击右键在当前目录弹出 cmd 命令行窗口,输入一下命令: 1 setx PATH "%Path%;< 这里是你 docfx.exe 所在的目录>" 三、使用 初始化基础项目 在你需要生成基础项目的文件夹下打开命令行窗口,运行 docfx init -q 就回在当前目录下生成一个 docfx_project 文件夹,这里面包含了一些基本配置,稍后再讲。 生成 API yml 文件 docfx 支持为 csproj 与 sln 来生成 API 文档,假如你的库有很多个的话,就可以直接根据 sln 解决方案来生成 API 文档。 我们来到 API 目录下面,在 csproj 文件所在目录打开命令行窗口,运行 docfx metadata .

Google Chrome 书签导出并生成 MHTML 文件

目的 因为某些原因需要将存放在 Google Chrome 内的书签导出到本地,所幸 Google Chrome 提供了导出书签的功能。 分析 首先在 Google Chrome 浏览器当中输入 chrome://bookmarks 来到书签管理页面,找到最右侧的三个点,选择导出书签,导出的文件是一个 HTML 文件,里面包含了所有书签的层级结构等信息。 使用 Notepad++ 打开该文件之后可以看到里面的内容如下: 粗略一看貌似没什么问题,其实在里面的 <DT> 与 <P> 都缺少了闭合标签,所以在解析的时候需要将其去除掉。去除掉之后的 HTML 文件结构大概像这样: 1 2 3 4 5 6 7 8 9 10 <DL> <H3>文件夹标题</H3> <DL> <H3>子文件夹标题</H3> <A HREF="书签地址">子文件夹书签1</A> <A HREF="书签地址">子文件夹书签2</A> </DL> <A HREF="书签地址">书签1</A> <A HREF="书签地址">书签2</A> </DL> 可以很明显看到这里是有一个层级关系的,所以我们可以通过递归来生成一个树形模型,生成之后,再遍历这个模型来根据这个树形结构来创建 MHTML 文件,并且进行归类。 实现 操作 HTML 文件在 .Net 下有一个很方便的第三方库,名字叫做 HtmlAgilityPack,通过这个库我们可以很方便地操作 HTML 文档,就跟 DOM 一样方便,而且它支持 XPath 选取。 项目地址:http://html-agility-pack.net/ GitHub 地址:https://github.com/zzzprojects/html-agility-pack Nuget 地址:https://www.
Built with Hugo
主题 StackJimmy 设计