随笔 - 10  文章 - 0  评论 - 25  阅读 - 47524
 
摘要: 一、调用存储过程1、不带参数CREATE PROCEDURE ProcedureWithoutParamsAS SELECT * FROM ORDER;调用db.ProcedureWithoutParams();2、带参数CREATE PROCEDURE ProcedureWithoutParams... 阅读全文
posted @ 2014-09-18 00:32 4444 阅读(1943) 评论(6) 推荐(0) 编辑
 
摘要: 一、结果排序-OrderBy(升序)-OrderByDescending(降序)db.Product.All().OrderByFactoryName();db.Product.All().OrderByFactoryNameDescending();或db.Product.All().OrderB... 阅读全文
posted @ 2014-09-17 01:27 4444 阅读(2554) 评论(0) 推荐(1) 编辑
  2016年8月21日

一、gRPC是什么?

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成 可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

二、为什么使用gRPC?

有了 gRPC, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑- gRPC 帮你解决了不同语言间通信的复杂性以及环境的不同.使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。

三、出现启动其中一个服务挂了、中间服务挂了、服务重新启动这三种情况,如何保证客户端的正常访问?

1、haproxy

缺点:每次连接都会创建一个channel,并发高的话资源消耗大,这样性能也会有问题

2、客户端负载均衡器

优点:单例,资源消耗小,性能比较好

缺点:可能还存在点问题,代码有点乱

3、zk、consul

以后改进方案

4、如果大家有更好的方案,欢迎大家拍砖,谢谢

四、相关包的引用版本是多少?

1、Grpc.Core.0.15.0

2、Grpc.HealthCheck.0.15.0-beta

3、Google.Protobuf.3.0.0-beta3

五、核心代码如下:

获取工作中的服务通道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static Channel GetWorkingChannel(string key)
    {
      Ensure.NotNullOrEmpty(key);
      CachedItem item = null;
      _cacheMap.TryGetValue(key, out item);
      Channel currentChosenChannel = null;
      if (_cacheMap.IsNotEmpty())
      {
        foreach (var channel in item.Channels.OrderBy(o => Guid.NewGuid()))
        {
          try
          {
            if (channel.State == ChannelState.Idle || channel.State == ChannelState.Ready)
            {
              channel.ConnectAsync(DateTime.Now.AddMilliseconds(100)).Wait();
              currentChosenChannel = channel;
              break;
            }
          }
          catch
          {
            channel.ShutdownAsync().Wait();
          }
        };
      }
 
      if (currentChosenChannel == null) InitWorkingChannelsByKey(key);
      return currentChosenChannel;
    }

  

进行健康检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static bool CheckIfConnectionIsWorking(Channel serverChannel)
    {
      if (serverChannel != null)
      {
        try
        {
          var client = new Health.HealthClient(serverChannel);
          var response = client.Check(new HealthCheckRequest { Service = "HealthCheck" });
          return response.Status == HealthCheckResponse.Types.ServingStatus.Serving;
        }
        catch (Exception ex)
        {
          serverChannel.ShutdownAsync().Wait();
          return false;
        }
      }
      return false;
    }

  

定时任务维护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private static void ExecuteMaintenance(object state)
   {
     if (Interlocked.CompareExchange(ref _executing, 1, 0) != 0)
       return;
     try
     {
       if (_cacheMap.Count == 0)
       {
         StopMaintenance();
         if (_cacheMap.Count != 0)
           StartMaintenance();
       }
       else
       {
         DateTime oldThreshold = DateTime.UtcNow - _timeout;
         var expiredItems = _cacheMap.Where(i => i.Value.Updated < oldThreshold).Select(i => i.Key);
         for (int i = 0; i < expiredItems.Count(); i++)
         {
           var key = expiredItems.ElementAt(i);
           DisposeChannelsByKey(key);
           InitWorkingChannelsByKey(key);
         }
       }
     }
     finally
     {
       Interlocked.Exchange(ref _executing, 0);
     }
   }

  

gRPC Client源代码已上传git,本人比较懒没有完整上传解决方案,该有的都有了。

 

posted @ 2016-08-21 23:27 4444 阅读(4678) 评论(0) 推荐(0) 编辑
  2015年11月18日
摘要: Dapper是一个轻型的ORM类。它有啥优点、缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话。如果玩过Oracle都知道,存储过程基本都是通过游标返回数据的,但是dapper原生操作游标会报异常,具体异常信息因为现在没有环境就不截图了。public FactoryPriceC... 阅读全文
posted @ 2015-11-18 23:57 4444 阅读(1693) 评论(0) 推荐(5) 编辑
  2015年8月21日
摘要: 有时候我们需要调用其他API的时候出现暂时连接不通超时的情况,那这时候可以通过Polly进行Retry。1、从nuget引用polly,2、定义需要处理的异常有哪些,比如Policy.Handle().Or()3、异常发生时候需要定义重试几次,等多久后再重试,比如 var policy = Poli... 阅读全文
posted @ 2015-08-21 00:20 4444 阅读(2918) 评论(0) 推荐(1) 编辑
  2014年9月23日
摘要: 1、减少Jquery使用处理dom遍历和复杂的脚本场景时,jquery可能有很大的帮助,不过在处理简单的、直截了当的代码场景就会迟缓。尽可能的避免jquery对象创建,尤其在循环中。2、优化循环用被缓存的数组长度优化前for (var i = 0; i < arr.length; i++) { ... 阅读全文
posted @ 2014-09-23 00:52 4444 阅读(3152) 评论(3) 推荐(4) 编辑
  2014年9月16日
摘要: simple.data是一个轻量级的、动态的数据访问组件,支持.net4.0。1、必须条件和依赖性:v4.0 or greater of the .NET framework, orv2.10 or greater of the Mono framework项目中引用Simple.Data.Core... 阅读全文
posted @ 2014-09-16 00:36 4444 阅读(3791) 评论(7) 推荐(1) 编辑
  2014年7月21日
摘要: 一般喜欢学习新技术的同学都用过.net4.5吧,那肯定会被简单、高效的异步编程模型所吸引吧。去年微软发布了Microsoft.Bcl.Async,该包由三个库组成:Microsoft.Bcl、Microsoft.Bcl.Async和Microsoft.Bcl.Build。、相关文章可以参考:Micr... 阅读全文
posted @ 2014-07-21 09:48 4444 阅读(7342) 评论(5) 推荐(1) 编辑
  2013年11月12日
摘要: 最近看园里有几篇写有关导出导入excel的博客,我正好最近在项目中也有涉及想来一起分享一下,正好整理一下自己的思路。一、异步的方式是通过iframe来实现,代码如下:if ($('#downloadexcel').length /// 表示返回的流数据。 /// [DataContract] public class ExcelResultMessage { #region [ Privates ] private MessageType type = MessageType.Info; private string ... 阅读全文
posted @ 2013-11-12 17:14 4444 阅读(7296) 评论(1) 推荐(3) 编辑
  2013年9月6日
摘要: 项目介绍:为前台网站提供rest接口来操作erp相关数据涉及db:oracle11技术方案:因为erp是用remoting来调用,我想rest实现部分调用remoting来操作减少耦合,当然性能上损失点。可惜架构师要求直接引用dll来调用言归正传,当初erp是用32位oracle客户端而我们机器都是装64位系统,所以编译时候必须用x86来,不然启动会报"未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。" ,后来在我的建议下换成64位客户端用anycpu编译就可以了。rest服务调用erp的接口需要引用Oracle.Da 阅读全文
posted @ 2013-09-06 09:42 4444 阅读(12157) 评论(3) 推荐(0) 编辑

点击右上角即可分享
微信分享提示