royee
royee
## 面试php/go 服务端开发常遇到过的 面试题 基本是 `lnmp` `mq` `redis` `swoole` `golang` 有些会问些 `lua` `nodejs` `python` `java` php nginx通信 tcp unix socket 区别 nginx accesslog errlog accesslog buffer phpfpm swoole 对比 go...
https://apisix.apache.org/zh/blog/2022/02/25/consul-api-gateway/ apisix集成consul https://apisix.apache.org/zh/blog/2022/02/21/nacos-api-gateway/ nacos 服务发现 https://apisix.apache.org/zh/docs/apisix/discovery/consul_kv/ apisix 发布了3.0 beta了, 活跃的社区
面试服务端开发: ## 被问到 大流量高并发系统架构如何设计? 高并发 我说下我的见解 学习 或 心得: 最弱为`mysql` 读写 越少打`mysql`越好 ,多考虑异步 锁 缓存 mysql分库分表,索引优化 `分布式`,`服务器集群`,`负载均衡 ` 拆各个服务 每个服务独立库表 关系型数据库用来落地 多用`nosql`补充 灵活用 动静分离 `cdn` 使用 go swoole 常驻内存,支持协程 异步非阻塞...
什么是分布式追踪 分布式系统 当我们使用 Google 或者 百度搜索时,查询服务会将关键字分发到多台查询服务器,每台服务器在自己的索引范围内进行搜索,搜索引擎可以在短时间内获得大量准确的搜索结果;同时,根据关键字,广告子系统会推送合适的相关广告,还会从竞价排名子系统获得网站权重。通常一个搜索可能需要成千上万台服务器参与,需要经过许多不同的系统提供服务。 多台计算机通过网络组成了一个庞大的系统,这个系统即是分布式系统。 在微服务或者云原生开发中,一般认为分布式系统是通过各种中间件/服务网格连接的,这些中间件提供了共享资源、功能(API等)、文件等,使得整个网络可以当作一台计算机进行工作。 分布式追踪 在分布式系统中,用户的一个请求会被分发到多个子系统中,被不同的服务处理,最后将结果返回给用户。用户发出请求和获得结果这段时间是一个请求周期。 当我们购物时,只需要一个很简单的过程: 获取优惠劵 -> 下单 -> 付款 -> 等待收货 然而在后台系统中,每一个环节都需要经过多个子系统进行协作,并且有严格的流程。例如在下单时,需要检查是否有优惠卷、优惠劵能不能用于当前商品、当前订单是否符合使用优惠劵条件等。  在一个复杂的分布式系统中,任何子系统出现性能不佳的情况,都会影响整个请求周期。根据上图,我们设想: 1.系统中有可能每天都在增加新服务或删除旧服务,也可能进行升级,当系统出现错误,我们如何定位问题? 2.当用户请求时,响应缓慢,怎么定位问题? 3.服务可能由不同的编程语言开发,1、2 定位问题的方式,是否适合所有编程语言? 分布式追踪有什么用呢 随着微服务和云原生开发的兴起,越来越多应用基于分布式进行开发,但是大型应用拆分为微服务后,服务之间的依赖和调用变得越来越复杂,这些服务是不同团队、使用不同语言开发的,部署在不同机器上,他们之间提供的接口可能不同(gRPC、Restful api等)。 为了维护这些服务,软件领域出现了 Observability...
golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在堆上分配。 能引起变量逃逸到堆上的典型情况: - **在方法内把局部变量指针返回** 局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。 - **发送指针或带有指针的值到 channel 中。** 在编译时,是没有办法知道哪个 `goroutine` 会在 `channel` 上接收数据。所以编译器没法知道变量什么时候才会被释放。 - **在一个切片上存储指针或带指针的值。** 一个典型的例子就是 `[]*string` 。这会导致切片的内容逃逸。尽管其后面的数组可能是在栈上分配的,但其引用的值一定是在堆上。 - **slice 的背后数组被重新分配了,因为 append 时可能会超出其容量( cap )。** slice 初始化的地方在编译时是可以知道的,它最开始会在栈上分配。如果切片背后的存储要基于运行时的数据进行扩充,就会在堆上分配。...
类似 php的xhprof 想度量这个应用程序的 CPU 性能数据, 只需要在 main 函数中添加 2 行代码即可: ```golang pprof.StartCPUProfile(os.Stdout) defer pprof.StopCPUProfile() ``` ``` go run main.go > cpu.pprof ``` 一般不建议将结果直接输出到标准输出,因为如果程序本身有输出,则会相互干扰,直接记录到一个文件中是最好的方式。 ```golang func main() { f, _ :=...
Go 语言并没有 enum 关键字,有用过 Protobuf 等的小伙伴知道,Go 语言只是 ”有限的枚举“ 支持,我们也会用常量来定义,枚举值也需要有字面意思的映射。 ```golang type FishType int const ( A FishType = iota B C D ) func main() { fmt.Println(A, B, C, D)...
init() 函数是 Go 程序初始化的一部分。 Go 程序初始化先于 main 函数,由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。 每个包首先初始化包作用域的常量和变量(常量优先于变量),然后执行包的 init() 函数。同一个包,甚至是同一个源文件可以有多个 init() 函数。 init() 函数没有入参和返回值,不能被其他函数调用,同一个包内多个 init() 函数的执行顺序不作保证。 一句话总结: ``` import –> const –> var –> init() –> main()...