一、 什么是 RPC

Restful 采用 Http 进行通讯,优点是开放、标准、简单、兼容性升级容易;

缺点是性能略低。在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote Procedure Call),RPC 由于采用二进制传输、TCP 通讯,所以通常性能更好。

.Net Core 下的 RPC(远程方法调用)框架有 gRPC、Thrift 等,都支持主流的编程语言。

RPC 虽然效率略高,但是耦合性强,如果兼容性处理不好的话,一旦服务器端接口升级,客户端就要更新,即使是增加一个参数,而 rest 则比较灵活。

最佳实践:对内一些性能要求高的场合用 RPC,对内其他场合以及对外用 Rest。比如 web 服务器和视频转码服务器之间通讯可以用 restful 就够了,转账接口用 RPC 性能会更高一些。

二、 Thrift 基本使用

参考资料:https://www.cnblogs.com/focus-lei/p/8889389.html

1、  下载thrift http://thrift.apache.org/

把thrift-***.exe解压到磁盘,改名为thrift.exe(用起来方便一些)

2、  编写一个UserService.thrift文件(IDL)

namespace csharp RuPeng.ThriftTest1.Contract
service UserService{
   SaveResult Save(:User user)        User Get(:i32 id)        list<User> GetAll()
} 

,
  FAILED = ,
}  

struct User {
    : required i64 Id;
    : required : required i32 Age;
    : optional bool IsVIP;
    : optional string Remark;
}

service定义的是服务类,enum 是枚举,struct是传入或者传出的复杂数据类型(支持对象级联)。

语法规范 http://thrift.apache.org/docs/idl

根据thrift语法生成C#代码

cmd -> thrift.exe -gen csharp UserService.thrift

创建一个类库项目 ThriftTest1.Contract,作为客户端和服务器之间的共用协议,把上一步生成的代码放进项目。

项目nuget安装apache-thrift-netcore:

Install-Package apache-thrift-netcore

3、 创建服务器端项目 ThriftTest1.Server,建一个控制台项目(放到 web 项目中或者在 Linux中用守护进程运行起来(SuperVisor等,类似Windows下的“Windows服务”)也可以)。

ThriftTest1.Server项目引用ThriftTest1.Contract

创建项目:ApplicationExtenssion.cs

编写实现类 UserServiceImpl.cs

public class UserServiceImpl : UserService.Iface
{
    public User Get(int id)
    {
        User u = new User();
        u.Id = id;
        u.Name = "用户" + id;
        u.Age = ; return u;
    }

    public List<User> GetAll()
    {
        List<User> list = new List<User>();
        list.Add(, Name = , Remark = "hello" });
        list.Add(, Name =  });
        return list;
    }

    public SaveResult Save(User user)
    {
        Console.WriteLine($"保存用户,{user.Id}"); return SaveResult.SUCCESS;
    }
}

修改Program下的Main函数 启动服务器端

TServerTransport transport = );//监听8800端口
var processor = new RuPeng.ThriftTest1.Contract.UserService.Processor(new UserServiceImpl());//设置实现类
TServer server = new TThreadPoolServer(processor, transport);
server.Serve();

监听8800端口

4、创建客户端项目也引用ThriftTest1.Contract项目

调用方法

))
    using (TProtocol protocol = new TBinaryProtocol(transport))
    using (var clientUser = new UserService.Client(protocol))
{
    transport.Open();
    User u = clientUser.Get();
    Console.WriteLine($"{u.Id},{u.Name}");
}

三、一个服务器中放多个服务

0.9.1之前只支持一个服务器一个服务,这也是建议的做法。之后支持多路服务在thrift中增加一个服务

修改UserService.thrift文件 添加以下内容 然后重新生成替换

service CalcService{
     i32 Add(:i32 i1,:i32 i2)
}

服务器:

1.创建CalcServiceImpl文件实现CalcService服务

2.修改Main方法如下:

TServerTransport transport = );
var processorUserService = new RuPeng.ThriftTest1.Contract.UserService.Processor(new UserServiceImpl())
var processorCalcService = new RuPeng.ThriftTest1.Contract.CalcService.Processor(new CalcServiceImpl());
var processorMulti = new TMultiplexedProcessor();
processorMulti.RegisterProcessor("userService", processorUserService);
processorMulti.RegisterProcessor("calcService", processorCalcService);
TServer server = new TThreadPoolServer(processorMulti, transport);
server.Serve();

客户端:

))
    using (TProtocol protocol = new TBinaryProtocol(transport))
    using (var protocolUserService = new TMultiplexedProtocol(protocol, "userService"))
    using (var clientUser = new UserService.Client(protocolUserService))
    using (var protocolCalcService = new TMultiplexedProtocol(protocol,"calcService"))
    using (var clientCalc = new CalcService.Client(protocolCalcService))
{
    transport.Open();
    User u = clientUser.Get();
    Console.WriteLine($"{u.Id},{u.Name}");
    Console.WriteLine(clientCalc.Add(, ));
}

https://www.cnblogs.com/focus-lei/p/8889389.html

(*)新版:thrift.exe -gen netcore UserService.thrift(支持.net Core)

貌似支持还不完善(http://www.cnblogs.com/zhaiyf/p/8351361.html )还不能用,编译也有问题,值得期待的是:支持异步。

四、Java 等其他语言的融入

和使用Restful做服务一样,Java也可以调用、也可以做Thrift服务,演示一下java调用c#写的Thrift服务的例子

Java编译器版本需要>=1.6

Maven添加组件包的支持(thrift maven版本一定要和生成代码的thrift的版本一致):

<dependency>

  <groupId>org.apache.thrift</groupId>

  <artifactId>libthrift</artifactId>

  <version></version>

</dependency>

<dependency>

  <groupId>org.slf4j</groupId>

  <artifactId>slf4j-log4j12</artifactId>

  <version></version>

</dependency>

在thrift的IDL文件中加入一行(各个语言的namespace等参数可以共存)

修改UserService.thrift文件 添加以下代码就可以控制生成的java类的报名,最好按照java的命名规范来。

namespace java com.rupeng.thriftTest1.contract 

产生java代码

thrift.exe -gen java UserService.thrift 

Java代码:

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
public class Main {
  public static void main(String[] args) throws Exception {
      System.out.println("客户端启动....");
      TTransport transport = new TSocket("localhost", 8800, 30000);
      TProtocol protocol = new TBinaryProtocol(transport);
      UserService.Client client = new UserService.Client(protocol);
      transport.open();
      User result = client.Get(1);
      System.out.println(result.getAge()+result.getName()+result.getRemark());
   }}

也可以用Java写服务器,C#调用。当然别的语言也可以。

接口设计原则“API design is like sex: Make one mistake and support it for the rest of your life”

五、 Thrift+Consul 服务发现

注册和发现和Rest方式没有什么区别。

consul支持tcp健康监测:https://www.consul.io/docs/agent/checks.html

因为 Thrift 一般不对外,所以一般不涉及和 API 网关结合的问题

gRPC 的优势:支持异步;支持 Http2。没有Thrift性能高

总结

回顾一下我们学到的微服务:服务治理和服务发现、熔断降级、API 网关。

不是所有项目都适合微服务架构,互联网项目及结构复杂的企业信息系统才可以考虑微服务架构。

设计微服务架构,模块拆分的原则:可以独立运行,尽量服务间不要依赖,即使依赖层级也不要太深,不要想着还要 join。按业务划分、按模块划分。

扩展知识:

1、    分布式跟踪、日志服务、监控等对微服务来说非常重要

2、    gRPC 另外一个 RPC 框架,gRPC 的.Net Core 支持异步。百度“.net core grpc” https://www.jianshu.com/p/f5e1c002047a

3、    https://github.com/neuecc/MagicOnion 可以参考下这位日本 mvp 写的 grpc 封装,不需要定义接口文件。

4、    nanofabrichttps://github.com/geffzhang/NanoFabric简单分析

5、    Surging https://github.com/dotnetcore/surging

6、    service  fabric

https://azure.microsoft.com/zh-cn/documentation/learning-paths/service-fabric/

7、    Spring Cloud 入门视频:http://www.rupeng.com/Courses/Chapter/755

8、    steeltoe http://steeltoe.io/ 参    考    文    章

https://mp.weixin.qq.com/s/g9w-qgT2YHyDX8OE5q-OHQ

9、    限流算法 https://mp.weixin.qq.com/s/bck0Q2lDj_J9pLhFEhqm9w

10、https://github.com/PolicyServer/PolicyServer.Local 认证 + 授权 是两个服务, identityserver 解决了认证 ,PolicyServer 解决授权

11、Using Polly with HttpClient  factory from  ASPNET Core 2.1

https://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory

12、CSharpKit 微服务工具包 http://www.csharpkit.com/

(11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)的更多相关文章

  1. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  2. ASP.NET Core 微服务初探[1]:服务发现之Consul

    ASP.NET Core 微服务初探[1]:服务发现之Consul   在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...

  3. .net core ——微服务内通信Thrift和Http客户端响应比较

    原文:.net core --微服务内通信Thrift和Http客户端响应比较 目录 1.Benchmark介绍 2.测试下微服务访问效率 3.结果 引用链接 1.Benchmark介绍 wiki中有 ...

  4. (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)

    说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...

  5. (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架

    创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...

  6. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  7. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  8. (10)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot+Identity Server

    用 JWT 机制实现验证的原理如下图:  认证服务器负责颁发 Token(相当于 JWT 值)和校验 Token 的合法性. 一. 相关概念 API 资源(API Resource):微博服务器接口. ...

  9. (6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  10. Asp.Net Core微服务再体验

    ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...

随机推荐

  1. Spark程序数据结构优化

    场景: 1.scala中的对象:对象头是16个字节(包含指向对象的指针等源数据信息),如果对象中只有一个int的属性,则会占用20个字节,也就是说对象的源数据占用了大部分的空间,所以在封装数据的时候尽 ...

  2. BD是什么角色

    BD是什么角色? 在一般创业公司里面,有了产品接下来就是运营了,而运营中很重要的一点就是BD,也就是所谓商务拓展了,俗一点说就是生意的合作拓展 https://www.jianshu.com/p/7d ...

  3. tkinter中lable标签控件(二)

    lable控件 对于tkinter来说,学起来很简单,只要设置好相应的参数即可出结果,所以不用刻意去记住这些参数.学习一遍后理解每个参数的作用是什么即可. 当下次用到的时候来笔记上看一下就行. 内容很 ...

  4. 【公众号系列】SAP S/4 HANA的移动平均价

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP S/4 HANA的移动平均 ...

  5. ALSA声卡驱动的DAPM(一)-DPAM详解

    最近使用tinymix 调试相应的音频通道,但是一直不知道音频通道的原理是什么.所以百度了一下,百度结果是与DPAM有关. 一.DAPM简介: DAPM是Dynamic Audio Power Man ...

  6. 解决关于phpstorm打开速度很慢的问题

    我的电脑是GTX950M , 8G 内存的 ,配置不算低但是打开phpstorm的速度非常的慢.基本上每次打开都要花一分钟以上,虽然打开sublime text3 只需要三四秒,但是phpstorm功 ...

  7. apache配置CA证书通过https通信

    Apache Httpd 2.2 实现https加密通讯 实际生产中CA证书一般是向一些专业认证的国际机构来进行申请的.我们会模拟使用OpenSSL生成的证书,来实现Apache的安全加密通讯,这与实 ...

  8. zabbix监控磁盘IO

    我这里有两种方法,感觉都不错.我这里主要是写一下监控的脚本. 1.使用iostat命令监控 1)首先打开配置文件的自定义脚本功能,然后编写脚本. #!/bin/bash ];then echo &qu ...

  9. Nginx安装成Windows服务

    因为有项目使用Nginx来做负载均衡,但是Nginx的Windows版本是不提供安装成服务的,所以服务器重启后Nginx并不会伴随启动和恢复.网上查了下,这里记录下解决方法,防止遗忘. 第一步:下载W ...

  10. 17秋 软件工程 团队第五次作业 Alpha Scrum10

    17秋 软件工程 团队第五次作业 Alpha Scrum10 今日完成的任务 世强:Android客户端成员列表完善.APP前端子部门和活动中心界面与数据交互: 港晨:Web前端主页的接口对接: 树民 ...