Go微服务之gRPC
RPC(Remote Procedure Call 远程过程调用)
一个节点请求另一个节点提供的服务
远程调用的参数传递的协议:json、xml、protobuf
远程调用会引入新问题:
Call ID映射
我们怎么告诉远程机器我们要调用add,而不是sub或者Foo呢?在本地调用中,函数体是直接通过函数指针来指定的,我们调用add,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。==然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。==
序列化和反序列化
客户端怎么把参数值传给远程的函数呢?在本地调用中, ...
Golang基础
Packages
同一个文件夹下的不同go源码文件,其包名必须一致。
同一个包下的源文件之间代码是透明的,不同源文件之间可以互相调用。
需要注意的是,main 包用于构建可执行文件,而其他包主要用于组织和复用代码。在一个目录中,所有的 Go 文件应该属于同一个包。包名通常与目录名一致,但这不是强制性的,因为包名是通过 package 语句来指定的。
在使用 go run 或 go build 命令时,Go 编译器会根据 package main 来识别程序的入口点。其他包的入口点则是通过导入这个包并调用其中的函数来实现的。
1234import ( "fmt" "math/rand")
导出包里的东西,go中导出的内容首字母是大写的
Function
在 Go 中类型是跟在变量名之后的,至于为什么要这样参见文档Go’s Declaration Syntax
123func add(x int, y int) int { return x + y}
当多个连续变量共享一个类型时可以省略除最后一个参数的类型的所有类型。 ...
外刊精读词汇积累
Bilibili: 三言两语杂货社 公众号:三言两语杂货社
《经济学人》20210313,气候披露
Regulators want firms to own up to climate risks
That is good news for investors. And for the planet?
regulator 监管机构
own up to sth./doing sth. 承担责任、坦白
America’s main financial regulator is taking an interest in climate change—and wants everyone to know. The Securities and Exchange Commission (SEC) has created a task-force to examine environmental, social and governance (ESG) issues, appointed a climate tsar and said it will “enhance its focus ...
基本数据结构简单实现(cpp)
按理说应该用面向对象的方式实现封装,但迫于c++功底并不扎实,就用结构体结合c++的模板函数结合教材和王道复习书来实现吧,方便随时翻看。
线性表
顺序表—SeqList.h
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960//// Created by knight1527 on 2022/6/21.//#ifndef DATASTRUCTURELIB_SEQLIST_H#define DATASTRUCTURELIB_SEQLIST_H#include <cstdlib>#define InitSize 10template <typename T>struct SeqList{ T* data; int MAXSIZE; int length;};template <typename T>void initSeqList(SeqLis ...
数据结构错题典题集
时间复杂度
(1)求如下递归方程的时间复杂度
T(n)={1,n=12T(n/2)+n,n>1T(n)=\begin{cases}
1, & n=1 \\
2T(n/2)+n, & n>1
\end{cases}
T(n)={1,2T(n/2)+n,n=1n>1
设n=2k(k≥0)n=2^k(k\geq0)n=2k(k≥0),则根据公式可以推出:
T(2k)=2T(2k−1)+2kT(2^k) = 2T(2^{k-1})+2^k
T(2k)=2T(2k−1)+2k
T(2k)=22T(2k−2)+2×2kT(2^k) = 2^2T(2^{k-2})+2\times2^k
T(2k)=22T(2k−2)+2×2k
T(2k)=2iT(2k−i)+i×2kT(2^k) = 2^iT(2^{k-i})+i\times2^k
T(2k)=2iT(2k−i)+i×2k
T(2k)=2kT(20)+k×2kT(2^k) = 2^kT(2^0)+k\times2^k
T(2k)=2kT(20)+k×2k
将2k=n和k=log2n2^k=n和k=l ...
hadoop整合spark框架
hadoop整合spark的安装与配置
书接上篇hadoop集群
由于服务器已经安装了hadoop集群,所以运行spark就用spark on yarn模式了,把资源调度交给yarn。
spark部署模式
安装spark
spark镜像
将spark安装包上传到/usr/local/中
123cd /usr/localsudo tar -zvxf spark-3.2.1-bin-hadoop3.2.tgzsudo mv spark-3.2.1-bin-hadoop3.2 /spark # 文件夹改名
配置
修改/usr/local/hadoop/etc/hadoop/yarn-site.xml
12vim /usr/local/hadoop/etc/hadoop/yarn-site.xml# 添加如下内容
12345678<property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value></property><pr ...
云服务器搭建hadoop集群思路与报错整理
云服务器搭建hadoop集群思路与报错整理
我的版本:hadoop:3.2.3 jdk: 11 centOS:7.6
建议在配置之前全部打一个快照方便出错搞混或者解决不了时回滚!为了避免后续启动集群各种各样连接超时,连接错误,禁止访问等问题,需在云服务器商提供的控制台开放所有端口。
大纲
创建hadoop用户与程序准备
创建hadoop用户与主机名配置
配置ssh免密登录
xsync文件分发脚本(尚硅谷)
安装jdk
安装hadoop
集群配置
集群启动
报错与处理办法
创建hadoop用户与程序准备
创建hadoop用户与主机名配置
我将使用三台云服务器搭建一个一主两从的服务器集群,搭建前先使用xshell或者其他连接工具连接上三台云服务器,选定一台配置较高的服务器当做主服务器(Master),(Master:2核4G,Slave1: 1核2G,Slave2:1核2G)。先配置Master在配置其他两台从机。
租服务器时不做设置登录上都是root用户,在xshell上执行命令
1useradd -m hadoop -s /bin/bash # 创建新用户hado ...
蓝桥杯B组_人物相关性分析
问题描述
思路
(1)暴力
刚开始做时,因为在输入时通过正则表达式分隔字符串比较方便,所以一直在想分割后的办法…
常规解法:遍历字符串,找到Alice和Bob的起点位置分别放入到一个集合中,分别遍历两个集合,找到K范围内前面匹配的目标的个数。提交然后超时了,不过能过70分的样例哈哈哈哈🤣🤣
(2)滑动窗口
同上,先遍历一遍字符串,将Alice和Bob的起始索引分别放到两个集合中
遍历Alice的集合,利用双指针维护一个指定范围的窗口,找到每个Alice在自身索引±K\pm K±K范围内的Bob索引个数即可。
AC代码
123456789101112131415161718192021222324252627282930313233343536373839import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;/** * @author duanqihang * Created with IntelliJ ...
蓝桥杯B组_后缀表达式
问题
思路
后缀表达式
从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
中缀表达式的括号优先级体现在后缀表达式中的字符顺序上(隐括号),如中缀表达式(3+(5*(3+4)))对应的后缀表达式为3534+*+,求后缀表达式的最大值可以通过中缀表达式来求,更容易理解。
分情况
(1): 当M等于0时(没有‘ - ’号),最大值即为所有数之和。
(2): 当M大于0,因为给定数有正有负,所以需要尽可能让负数变为正数,可以利用中缀表达式中的括号... - [...]将负数置于括号内,有可能所有数都是正数只是有-运算符而已,所以需要用两个数保证表达式成立,最小损失—
max...-[min...],剩下的算符与数值任意组合,结果为正数的放在max后面,为负的放在min后面,最终式子的结果即为最大值。
所以求最终答案的式子可以表示为 :MAX- MIN + |a2|+ … + |an-1|
例:
N: 1 M: 2 num[]: 2 -3 4 -5
最大值: 4 + 2 - (-3) - [ ...
CodeForces_1519D
题目描述
sources: CodeForces_1519D
思路
从题意可以看出,翻转后的结果只与翻转那一段区间的乘积的变化有关,所以我只需要知道这段区间翻转前后乘积的差值并与所有翻转区间的差值进行比较即可,最终找到的最大差值加上翻转前的乘积就是最终的答案。因为任意一个区间的差值可以由其子区间求得,所以首选dp。
区间DP
区间i to j的差值由区间i+1 to j-1的差值加上a[i],a[j]翻转前后的乘积变化即可(因为求的是区间i to j 变化前后的差值,并没有求此区间的最优策略,所以不用比较)。所以用个中间变量记录最大差值就行,想得到目的区间同理。
综上得出状态转移方程:
1dp[i][j] = dp[i + 1][j - 1] + b[i]*a[j] + b[j]*a[i] - a[i]*b[i] - a[j]*b[j];
注意
遍历顺序
如图样例一箭头指出的关系,算dp[i][j]前应当已经算出dp[ i+ 1][j - 1]的值,所以遍历顺序应当从表格中上到下每排或者右到左每列。
遍历:
123456// 上到下for (int j = 1; j < n; ...









