GIS开发进阶之路(八) gRPC、Kafka

1. gRPC:

意义:在两个(多个)应用程序(强调!)中间传递消息和数据

C#:

(1)新建.Net Core类库项目,命名为gRPCDemo;

(2)新建两个.Net Core控制台应用,分别命名为gRPCServer和gPRCClient;

(3)在解决方案Nuget包里安装Google.Protobuf、Gprc及Gprc.Tools;//此处应记住Gprc.Tools的版本

(4)在gRPCDemo内新建一个helloworld.proto文件,在里面写入:

syntax = "proto3";
package gRPCDemo;
service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
​
message HelloRequest {
  string name = 1;
}
​
message HelloReply {
  string message = 1;
}

(5)将C:\Users\Linus.nuget\packages中的Google.Protobuf、Gprc及Gprc.Tools文件夹拷到gRPCDemo文件夹下新建的packages文件夹中,在控制台中cd到gRPCDemo文件夹中,然后输入

packages\grpc.tools\2.31.0\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out gRPCDemo gRPCDemo\helloword.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\grpc.tools\2.31.0\tools\windows_x86\grpc_csharp_plugin.exe
//tips
1. -I 指定一个或者多个目录,用来搜索.proto文件的,如果不指定,那就是当前目录,因为-I已经指定了。
2、 --csharp_out 用来生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。 
3、--grpc_out 
     csharp_out是输出类似于平时写的实体类,接口,定义之类的。生成的文件叫xxx.cs.
     grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的叫xxxGrpc.cs。
4、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 这个就是c#的插件,python有python的,java有java的。必须要指定它。

(6)随后会得到如图结构:

img

 

(7)编写服务端

using Grpc.Core;
using GRPCDemo;
using System;
using System.Threading.Tasks;
​
class gRPCImpl : gRPC.gRPCBase
{
    // 实现SayHello方法
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
    }
}
​
class Program
{
    const int Port = 9007;
​
    public static void Main(string[] args)
    {
        Server server = new Server
        {
            Services = { gRPC.BindService(new gRPCImpl()) },
            Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
        };
        server.Start();
​
        Console.WriteLine("gRPC server listening on port " + Port);
        Console.WriteLine("任意键退出...");
        Console.ReadKey();
​
        server.ShutdownAsync().Wait();
    }
}

(8)编写客户端

using Grpc.Core;
using GRPCDemo;
using System;
​
class Program
{
    static void Main(string[] args)
    {
        Channel channel = new Channel("127.0.0.1:9007", ChannelCredentials.Insecure);
​
        var client = new gRPC.gRPCClient(channel);
        var reply = client.SayHello(new HelloRequest { Name = "LineZero" });
        Console.WriteLine("来自" + reply.Message);
​
        channel.ShutdownAsync().Wait();
        Console.WriteLine("任意键退出...");
        Console.ReadKey();
    }
}

(9)启动时先启动服务端,再启动客户端即可

JAVA:

暂未做,列入下周计划

2. Kafka

好处:

(1)解耦

(2)可恢复性

(3)缓冲

(4)灵活性&峰值处理能力

(5)异步通信

架构:

img

1)Producer :消息生产者,就是向 kafka broker 发消息的客户端; 2)Consumer :消息消费者,向 kafka broker 取消息的客户端; 3)Consumer Group (CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

4)Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个 topic。

5)Topic :可以理解为一个队列,生产者和消费者面向的都是一个 topic;

6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列; 7)Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。

8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。

9)follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower。

工作流程:

img

Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。 topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。

img

由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。每个 segment对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic 名称+分区序号。例如,first 这个 topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2。

img

“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值