针对 Ocelot 网关的性能测试

一、背景

目前我们项目是采用的 Ocelot 作为 API 网关,并且在其基础上结合 IdentityServer4 开发了一套 API 开放平台。由于部分项目是基于 ABP 框架进行开发的,接口的平均 QPS 基本是在 2K~3K /S 左右 (E3 1231 16G)。采用 Ocelot 进行请求转发之后,前端反馈接口调用速度变慢了,也没有太过在意,以为是项目接口的问题,一直在接口上面尝试进行优化。

极限优化接口后仍然没有显著改善,故针对 Ocelot 的性能进行压力测试,得到的结果也是让我比较惊讶。

C# 当中 LINQ 的常规用法 (Lambda 方式)

1. IEnuemrable.Select()

Select 方法比较简单,就是在原有序列的基础上,为每个元素建立一个新的输出形式(类型)。

标准用法如下:

 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
public class TestClass
{
	public string Name { get; set; }

	public int Age { get; set; }
}

void Main()
{
	var testList = new List<TestClass>
	{
		new TestClass{Name = "张三",Age = 18},
		new TestClass{Name="李四",Age = 32},
		new TestClass{Name="王二",Age = 24}
	};

	var selectResult = testList.Select(student => new
	{
		Name = student.Name,
		NewAge = student.Age + 20
	});

	foreach (var student in selectResult)
	{
		Console.WriteLine($"姓名:{student.Name},新的年龄:{student.NewAge}");
	}
}

输出结果:

1
2
3
姓名:张三,新的年龄:38
姓名:李四,新的年龄:52
姓名:王二,新的年龄:44

这样 newResult 的结果就是我们所投射出来新序列,同时 IEnumerbale<T>.Select() 也拥有 延迟执行 的特性,只会在我们需要用到的时候才会进行计算。

C# 多线程学习笔记 - 3

一、基于事件的异步模式

  1. 基于事件的异步模式 (event-based asynchronous pattern) 提供了简单的方式,让类型提供多线程的能力而不需要显式启动线程。

    • 协作取消模型。
    • 工作线程完成时安全更新 UI 的能力。
    • 转发异常到完成事件。
  2. EAP 仅是一个模式,需要开发人员自己实现。

  3. EAP 一般会提供一组成员,在其内部管理工作线程,例如 WebClient 类型就使用的 EAP 模式进行设计。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    // 下载数据的同步版本。
    public byte[] DownloadData (Uri address);
    // 下载数据的异步版本。
    public void DownloadDataAsync (Uri address);
    // 下载数据的异步版本,支持传入 token 标识任务。
    public void DownloadDataAsync (Uri address, object userToken);
    // 完成时候的事件,当任务取消,出现异常或者更新 UI 操作都可以才该事件内部进行操作。
    public event DownloadDataCompletedEventHandler DownloadDataCompleted;
    
    public void CancelAsync (object userState);  // 取消一个操作
    public bool IsBusy { get; }                  // 指示是否仍在运行
    
  4. 通过 Task 可以很方便的实现 EAP 模式类似的功能。

C# 当中 foreach 的原理

在 C# 当中的 foreach 语句实际上就是遍历迭代器的语法糖。例如我们拥有以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class TestClass
{
    public void TestMethod()
    {
        var integers = new int[] {1,2,3,4,5,6,7,8,9};
        
        foreach(var @int in integers)
        {
            Console.WriteLine(@int);
        }
    }
}

JSON 序列化的时候忽略无效的属性值

例如我拥有以下代码。

1
2
3
4
5
6
public class NewObject
{
    public int? TestValue { get; set; }

    public int? Age { get; set; }
}

当我为 TestValue 属性传入一个非法数据的时候,在使用 JSON.NET 进行反序列化时会抛出异常。例如我通过以下代码对一个字符串进行反序列化,如果不出意外的话会提示无效参数值的异常。

1
var newValue = JsonConvert.DeserializeObject<NewObject>(@"{""TestValue"":""FFFF"",""Age"":15}",settings);

通过 Stackoverflow 查询得知,可以通过在反序列化时指定 JsonSerializerSettings 对象进行忽略。

Built with Hugo
主题 StackJimmy 设计