avatar
在Kubernetes上gRPC是如何通过Headless Service负载均衡

在Kubernetes上gRPC是如何通过Headless Service负载均衡

星期一,十二月 20 日,2021 年

gRPC 是用于进程间通信的最流行的现代 RPC 框架之一。 它是微服务架构的绝佳选择。 而且,毫无疑问,部署微服务应用程序最流行的方式是 Kubernetes。

Kubernetes部署可以具有相同的后端实例,为许多客户端请求提供服务。 Kubernetes 的 ClusterIP 服务提供负载均衡的IP地址。 但是这种默认的负载平衡不适用于gRPC开箱即用。

如果你使用gRPC并在 Kubernetes 上部署了许多后端服务,那么本文档适合你。

avatar归零
3 分钟阅读
关于Go1.18你想知道的都在这里

关于Go1.18你想知道的都在这里

星期日,十二月 19 日,2021 年

原文:https://betterprogramming.pub/golang-1-18-what-you-need-to-know-a5701f7e14ab 在Go 1.18中,有两件大事是你需要知道的。类型参数(在其他语言中称为泛型)和模糊测试,但为什么它们如此重要? Golang团队正在努力开发Go1.18,该版本将于2022年2月发布,它将是一个大的版本。Go1.18将引入泛型和模糊测试,这有可能彻底改变我们开发和测试Go程序的方式。我们将在下面看一下这两个新特性。 类型参数 类型参数将允许Go程序员用占位符类型名称定义函数和方法。这将允许开发人员编写可以在项目的不同部分重复使用的代码,但仍然可以对他们期望支持的所有数据类型进行通用处理。 让我们来看看一个普通的Go函数(在1.18之前),计算两个数中较小的一个数。 func min(a, b int) int { if a < b { return a } return b } 上面这个方法中,我们把两个整数作为参数,min(1,2)和min(2,1)都将返回1。到目前为止还不错,但是当你想得到两个浮点数的较小值时,怎么办呢?我们将不得不写一个新的函数,它需要两个浮点数作为参数,而且我们不能重复使用第一个函数的代码。函数的主体仍然是完全相同的代码。如果我们想得到两个float64数的较小值,我们将不得不再次编写相同的函数,以float64作为参数。 现在让我们来看看Go的泛型。你现在可以用一个任意的占位符类型名称来定义函数,这个名称将作为其他类型的参数。在Go中,泛型是以类型T的形式来写的。 这意味着你可以用任何占位符类型的名字来定义一个函数,这个名字以后会被另一个参数填入。现在我们用新的泛型方法重构之前的例子。 type numeric interface { type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64 } func min[T numeric](a, b T) T { if a < b { return a } return b } 如上,这段代码有点长。首先,我们定义一个接口,它将所有的数字类型声明为numeric的新类型。这意味着我们可以在泛型中使用float64和int。然后,像之前一样,我们定义一个新的min函数。 不同的是,现在这个函数在头部有一个类型参数:min[T numeric]…. 这告诉Go,类型T应该是一个数字类型,所以是我们在接口中声明的任何类型。然后,像以前一样我们声明一个函数,只不过我们用T代替了int。 如果新的函数现在被调用,Go会检查用户提供的类型是否符合接口的要求。如果是的话,它将在整个函数中用该类型替换Tw。因此,如果我们输入一个int类型的数字,我们也会得到一个整数的回报。如果我们输入一个float64,我们将得到一个float64的返回值,以此类推。因此,我们现在有了一个单一的 “全能 “函数,而不是写12个内容完全相同的函数,但对Go中的每个数字类型都有不同的参数类型。
@ 归零
1 分钟阅读
“机器学习通用工作流程”

“机器学习通用工作流程”

星期一,六月 10 日,2019 年

机器学习的通用工作流程总结为如下几个步骤:

1. 定义问题,收集数据集

首先我们必须先定义多面对的问题。

  1. 输入的数据是什么?你要预测什么?
  2. 你面对的是什么类型的问题?二分类问题、多分类问题、标量回归问题
    向量回归问题还是其他问题,确定问题类型,有助于选择模型架构,损失函数。
    同时做出如下假设
  • 假设输出可以根据输入进行预测
  • 假设可用数据包含足够多的信息,足以学习输入和输出之间的关系
@ 归零
1 分钟阅读
Pandas

Pandas

星期三,四月 10 日,2019 年

Pandas 速查手册

对于数据科学家,无论是数据分析还是数据挖掘,如果用 Python作为工具,Pandas是一个非常重要的Python包,它不仅提供了很多方法,是的数据处理变得非常简单,同时由于底层使用Numpy,使得数据处理的速度也很快,比Python内置的方法有很大优势。

Pandas包导入

import pandas as pd
import numpy as np
@ 归零
1 分钟阅读
ReactiveCocoa中的基本算子

ReactiveCocoa中的基本算子

星期日,八月 14 日,2016 年

原文链接: Basic Operators

这个文档解释ReactiveCocoa中最常用的Operator,以及一些用例。注意Operators,在这里指的是signal和signal producers之间的转换,不是Swift中的操作符,换句话说,这些是ReactiveCocoa提供处理事件流的组合原语。该文档使用术语“事件流”来描述Signal和SignalProducer的概念。

事件流副作用

观察(Observation)

Signal可以被观察通过observe函数,需要一个Observer作为参数,任何事件流都会发送给它。

signal.observe(Signal.Observer { event in
  switch event {
    case let .Next(next):
      print("Next: \(next)")
    case let .Failed(error):
      print("Failed: \(error)")
    case .Completed:
      print("Completed")
    case .Interrupted:
      print("Interrupted")
  }
})
@ 归零
2 分钟阅读
如何解决retain cycle

如何解决retain cycle

星期三,十月 28 日,2015 年

当遇到retain cycle是,一般我们的解决办法是让一个变为weak reference,而选择让那个变成weak reference是个问题。 我们可以把存在retain cycle的两个对象看成是 父-子 关系。 在这个关系当中,父可以拥有子,但是子不可以拥有父,因此,在这个问题中,我们可以把作为 父 的对象定义为strong, 而作为 子 的对象定义为weak,这样就解决了retain cycle。
@ 归零
1 分钟阅读
一个iOS View crash问题

一个iOS View crash问题

星期四,十月 15 日,2015 年

[2015-10-15] 用xib做了一个简单的界面,程序启动时会crash掉,xcode error打印信息: Terminating app due to uncaught exception ‘UIViewControllerHierarchyInconsistency’, reason: ‘A view can only be associated with at most one view controller at a time! View <UIView: 0x7f914af22610; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x7f914af22980» is associated with <UIViewController: 0x7f914ae49a90>. Clear this association before associating this view with <TestViewController: 0x7f914ac7f680>.’
@ 归零
1 分钟阅读
统一账户管理系统RESTful api设计

统一账户管理系统RESTful api设计

星期五,四月 10 日,2015 年

LDAPAdmin, 为用户管理提供一组API,以HTTP-based RESTful API的形式提供服务,提供了对ldap数据的增删改查功能。主要用到了HTTP的四种方法:GET, POST, PUT和 DELETE。 下面主要对LDAPAdmin 的REST Api做个简单介绍: ##Functionality ###Terminology ###User stories 利用该组件的HTTP API,通过提交一组描述 用户/部门/系统/管理员的JSON数据,添加、删除、更新、查询数据; 利用该组件的HTTP API,可以方便的添加一条 用户/部门/系统/管理员记录; 利用该组件的HTTP API,可以方便的更新一条指定的 用户/部门/系统/管理员记录; 利用该组件的HTTP API,可以方便的将指定的 用户/部门/系统/管理员删除; ###Scope and Non-Scope ####Scope 用户/部门/系统/管理员 信息相关数据的添加、更新、删除; 查询 用户/部门/系统/管理员的信息; 用户/部门/系统/管理员 的有效性; ###Non-Scope 用户数据的可靠性,数据由管理员负责维护 ##Low-level Design ###Response Code Code Remind Description 200 OK – [GET] 成功返回用户请求的数据 201 CREATED – [POST/PUT] 新建/修改数据成功 204 NO CONTENT – [DELETE] 删除数据成功 400 INVALID REQUEST – [POST/PUT 用户发出请求有误,服务器没有新建/修改数据 401 Unauthorized – [*] token认证失败,token过期等情况 403 Forbidden – [*] 用户认证成功,但没有权限进行相应操作(权限细分) 404 NOT FOUND – [*] 请求的资源(在这里是表、字段不存在等情况) 406 NOT Acceptable – [GET] 用户请求的格式不可得 500 INTERNAL SERVER ERROR – [*] 服务器内部错误,用户无法判断请求是否成功 ###Response| Result #####除了每个响应都携带的返回码和可选的description字段,以下为该API的返回结果(具体形式在每种请求中都有举例):
@ 归零
4 分钟阅读
关于sizeof

关于sizeof

星期三,七月 9 日,2014 年

前两天犯了一个愚蠢的错误,由于对sizeof理解的错误,导致代码出现了一个bug,具体代码逻辑如下: char buf[512]; char *ptr; int size; ptr = buf; size = sizeof(ptr); 本来是计算buf的大小,但这样写其实只是得到 char指针类型的大小,错误的以为ptr指向buf时,用sizeof获取的也是buf的大小。通过了解,如果sizeof的操作数为指针时,不管指针指向什么类型,值都是指针类型的大小,32位系统为4.具体sizeof的结果如下: 1、当操作数为数据类型时,所得结果为给数据类型的大小。如:32bit系统上,sizeof(char)= 1 ,sizeof(int) = 4。 2、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near 类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 3、当操作数具有数组类型时,其结果是数组的总字节数。 4、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的 sizeof是这种类型对象的总字节数,包括任何垫补在内。 让我们看如下结构: struct { char b; double x; } a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)= 9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对 齐。如double类型的结构成员x要放在被4整除的地址。 5、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
@ 归零
1 分钟阅读

© 2014 - 2022 Lionel's Blog

Powered by Hugo with theme Dream.