docker和k8s、nginx、rpc的学习介绍和实战

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

docker: 出现是因为相比于虚拟机资源复用更加灵活虚拟机是一个完整的操作系统占用空间大启动慢docker容器技术可以根据也无需求配置不同的环境不会互相影响。镜像操作方便迁移实现build once run everywhere

docker主要就是隔离和标准化。核心技术是namespace技术和cgroup技术。
namespace是让不同容器看起来没有关联防止不同空间命名冲突比如pid,用户Idip地址等。
每一个容器有自己的ns, 就和多进程一样一个进程的1234地址和另一个进程的1234地址不是一个物理地址虚拟地址。不同ns中相同的命名也不是真正相同的资源。
可以通过proc/pid/ns文件夹查看进程所属的ns然后想要修改的话可以用nsenter进入指定的别的ns空间。

cgroup是用起来隔离的技术。树状结构组织若干个进程组成cgroup若干个cgroup树状排列同时有很多树代表不同的系统资源CPU,内存网络设备等
可以进行一些资源的监控限制等操作比如限制mysql一组进程核绑定占用多大CPU时间内存和带宽可以访问哪些设备等等。

常用操作
先拉取镜像 docker pull ubuntu
然后启动一个容器 docker run -i -t -name 名字 cmd
如果是交互式的话就是/bin/bash

docker image查看镜像
docker ps 查看容器 docker inspect c_id查看具体容器信息
docker top 容器id 查看其中的进程

编译dockfile还可以post发布镜像到docker_hub库里面没试过。

我用它主要在两个方面一个是计算机系统实验中每次实验要装不同的环境而且是不兼容的所以为了方便就用了docker加载镜像。不然的话就要卸载。

还有一个就是在docker部署网站。静态
步骤是1.端口映射一下docker run -p 80指定80端口。
2、下载nginx和vim. 写一个简单的html文件修改nginx配置为那个文件启动nginx。然后ctrl+Q退出保证容器还是在运行的。然后docker port web查看一下映射情况通过宿主机地址127.0.0.1加映射端口访问

k8s
要知道k8s出现的原因其实就是数据中心的操作系统为了管理很多机器的软硬件资源的。
主要组成和操作系统类似。
调度器controller 进程线程进程组docker pod service 网络每个pod有ip地址存储文件存储对象存储块存储有自己的接口管理和包管理工具helm
关注一下Kubernetes 会将 Service DNS的名字作为域名解析成为一个虚拟的 Cluster IP然后通过负载均衡转发到后端的 Pod。虽然 Pod 可能漂移IP 会变但是 Service 会一直不变。Service就相当于一组pod,也就是实现某种功能的一个进程集合比如mysql的一组进程,也就是说在进行service作为虚拟ip的时候真正到的pod会变飘逸的但是service不会变的有点类似于NAT可以实现负载均衡了。

k8s解决的核心问题是

服务发现和负载均衡
也就是说给你一个程序你需要决定在哪个机器的pod上运行。k8s的容器本身就可以指定资源大小CPU,内存等。它有自己的DNS和ip地址公开开容器流量大的时候还可以负载均衡。

还有存储编排可选择对象文件块存储

自我修复高可用。

架构传统的客户端服务端架构
服务端由一组master节点存储状态调度分配资源和一系列worker节点组成。

主节点结构
它主要负责接收客户端的请求安排容器的执行并且运行控制循环将集群的状态向目标状态进行迁移。主要有API和客户端交互接口etcd键值数据库存储状态调度器主要负责的是让pod在特定空闲节点运行调度的策略包括资源的需求亲和性一组进程最好在一台主机进行通信方便还有一个controler控制器负责故障的通知转移以及副本令牌控制等

其他的 Worker 节点实现就相对比较简单了它主要由 kubelet 和 kube-proxy 两部分以及运行时docker组成。
kubelet: 是工作节点执行操作的 agent负责具体的容器生命周期管理根据从数据库中获取的信息来管理容器并上报 pod 运行状态等。
kube-proxy: 是一个简单的网络访问代理同时也是一个 Load Balancer。它负责将访问到某个服务的请求具体分配给工作节点上同一类标签的 Pod。
kube-proxy 实质就是通过操作防火墙规则(iptablesservice ip到pod ip的映射)来实现 Pod 的映射。客户端通过services的cluster ip来访问这个代理会根据iptable规则重定向到其中的pod流量大的时候还可以负载均衡service就是一组pod,保证健壮性。

Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象它们能够表示系统中部署的应用、工作负载、网络和磁盘资源共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。

配置文件用yaml写kubectl 是 Kubernetes 自带的客户端可以用它来直接操作 Kubernetes 集群。

介绍一下k8s。先说是数据中心的操作系统整体架构什么样主节点和worker节点 抽象层次值得学习docker,pod,service,volume,ns
关于存储有几种存储方式接口统一
关于网络有pod唯一ip地址和service cluster ip地址自己的网络模型
关于客户端有自己的kubectl 和helm包管理工具。
如何在k8s上发布服务
NodePort、LoadBalancer、Ingress控制器三种方式将服务公开
NodePort30000-32767范围内分配一个端口每个节点都将该端口代理到您的服务
LoadBalance服务类型会自动部署一个外部负载均衡器该外部负载均衡器与特定的IP地址关联并将外部流量路由到集群中的Kubernetes服务
Ingress控制器通常不会消除对外部负载均衡器的需要只是在负载均衡器后面增加了一个额外的路由和控制层。

nginx介绍和实战
nignx是正向代理为客户端代理服务端不知道反向代理负载均衡和动静分离。特点是内存小高性能高并发。

nignx还可以实现高可用keeplived选项可以增加nginx服务器的数量

Nginx配置文件内部也是epoll接收客户端新连接然后子进程线程处理它和服务器连接负载均衡
全局块 影响 nginx 服务器整体运行的配置指令。比如worker_process越大代表支持并发数越多。

events块主要影响Nginx服务器与用户的网络连接。比如 worker_connections 1024; 支持的最大连接数。

第三部分 http块
http 块又包括 http 全局块和 server 块是服务器配置中最频繁的部分包括配置代理、缓存、日志定义等绝大多数功能。
server块配置虚拟主机的相关参数。
location块配置请求路由以及各种页面的处理情况。
比如下面这个例子在浏览器地址栏输入 http://192.168.4.32/example/a.html 平均到 5000 和 8080 端口中实现负载均衡效果。
upstream myserver {
server 192.167.4.32:5000;
server 192.168.4.32:8080;
}

server {
listen 80; #监听端口
server_name 192.168.4.32; #监听地址

location  / {             
    root html;  #html目录        
    index index.html index.htm;  #设置默认页    
    proxy_pass  http://myserver;  #请求转向 myserver 定义的服务器列表      
}

}
在server里面监听你要访问的那个网站和端口http是80 然后定义自己的服务器的ip+port。在location里面 proxy_pass设置为自己的地址 index设置默认的网页。
其中负载均衡的形式可以是默认轮询或者weight权重或者 ip_hashfair响应时间短的得到
location ~代表正则表达式匹配

Nginx 缓存 expires 3d; 通过 expires 参数设置可以使浏览器缓存过期时间之前的内容减少与服务器之间的请求和流量。

动静分离设置动静两个地址然后location匹配如果是jsp,php需要和后端交互的就到动态网址静态的比如jpg,css等就不需要和服务端交互了。

高可用怎么实现
首先要安装keeplivd程序 相当于一个路由它通过一个脚本来检测当前服务器是否还活着如果还活着则继续访问否则就切换到另一台备份服务器。
修改配置文件keepalived 将 nginx 服务器绑定到一个虚拟 ip nginx 高可用集群对外统一暴露这个虚拟 ip客户端都是通过访问这个虚拟 ip 来访问 nginx 服务器 。

nignx原理只是转发操作真正的处理请求是后端服务器做的。
一个master和若干worker进程。客户端发送一个请求首先要经过 master管理员收到请求后会将请求通知给 worker多个 worker 以争抢的机制来抢夺任务得到任务的 worker 会将请求经由 tomcat应用容器 等做请求转发、反向代理、访问数据库等

一个 master 和多个 worker 的好处
可以使用 nginx -s reload 进行热部署。
每个 worker 是独立的进程如果其中一个 worker 出现问题其它 worker 是独立运行的会继续争抢任务实现客户端的请求过程而不会造成服务中断。

nignx的高级应用
跨域问题比如在一个前端项目里请求另一个后端因为跨域所以请求无法响应。如果前后端都不想修改代码可以在nignx的server块add_header允许哪些跨域的请求、方法、cookie等。

配置SSL证书: 要在阿里云注册域名和SSL证书然后为nginx加上http_ssl_module网站如果没有备案会被拦截会导致不能访问正规站点都是要备案的。

防盗链配置 盗链通俗一点的理解就是别人的网站使用自己服务器的资源比如常见的在一个网站引入其他站点服务器的图片等资源这样被盗链的服务器带宽等资源就会额外被消耗在一定程度上会损害被盗链方的利益所以防盗链是必要的这里通过nginx简单实现静态资源防盗链的案例原理很简单就是判断一下请求源是否被允许。在Location里面对于非法的直接return 403

总结说一下是什么和特点原理以及配置文件配置过程完成负载均衡缓存高可用实现高级应用。

rpc知识点公司内部通信

远程过程调用在微服务分布式背景下涉及到不同服务器的协作。rpc就是为了让调用远程方法根调用本地的一样只要规定参数名和参数就可以。
既然有了 http为什么还要用 rpc 调用?
通信协议并不是rpc重点。rpc是一个方法而http是一种协议.所以更多的是封装了 “服务发现”“负载均衡”“熔断降级” 一类面向服务的高级特性。可以这么理解rpc框架是面向服务的更高级的封装。
(rpc优点效率高二进制但是不绝对因为http2也是二进制 简洁方法多了后需要记住很多函数和参数get,post等rpc把方法存根在本地序列化传送最重要是封装了高级特性 缺点可读性低双方架构需要一致。
http优点可读性高双方语言架构不需要一致。

常见的rpc: grpc,brpc, thrift,dubbo等
rpc调用框架
rpc调用框架是服务端有个stub,他可以把服务B的接口对象函数参数作为参数序列化然后通过传输协议http2protobuf等给BB反序列化然后计算得到结果返回给A。

涉及到的技术
1**.序列化协议**很重要的一部分
在网络传输中需要二进制传输所以要把对象转换成字节序列。
序列化协议有哪些
最早期的cobra com等太复杂需要汇编淘汰了 java自带的库xml,json等可读性好但是时空效率低protobuf 、Hessian2
protobuf核心就是消息message和接口service.服务端与服务端之间只需要关注接口方法名service和参数message即可通信而不需关注繁琐的链路协议和字段解析极大降低了服务端的设计开发成本。

动态代理
RPC的调用内部核心技术采用的就是动态代理。
也就是要像调用本地方法一样调用远程。RPC 会自动给我们生成一个动态代理类当我们在项目中注入接口的时候运行过程中实际绑定是这个接口生成的代理类这样在接口方法被调用的时候它实际上是被生成代理类拦截了这样我们就可以在生成的代理类里面加入远程调用的逻辑。

服务注册发现

1注册与发现流程

服务注册服务提供方将对外暴露的接口发布到注册中心内注册中心为了检测服务的有效状态一般会建立双向心跳机制。
服务订阅服务调用方去注册中心查找并订阅服务提供方的 IP并缓存到本地用于后续调用。

2如何实现基于ZK

A. 在 ZooKeeper 中创建一个服务根路径可以根据接口名命名例
如/micro/service/com.laowang.orderService在这个路径再创建服务提供方与调用方目录server、
client分别用来存储服务提供方和调用方的节点信息。
B. 服务端发起注册时会在服务提供方目录中创建一个临时节点节点中存储注册信息。
C. 客户端发起订阅时会在服务调用方目录中创建一个临时节点节点中存储调用方的信息同时watch 服务提供方的目录/micro/service/com.laowang.orderService/server中所有的服务节点数据。当服务端产生变化时ZK就会通知给订阅的客户端。
ZooKeeper方案的特点
强一致性ZooKeeper 集群的每个节点的数据每次发生更新操作都会通知其它 ZooKeeper 节点同时执行更新。

服务端调用代码生成一个zk类开启发布节点包括服务和方法服务是永久节点方法是临时节点还会加ip+port
客户端只要使用get_data方法就可以实现找到服务器的ip+port
客户端还可以watch监听服务一旦有变化就能知道。

健康监测 心跳机制

负载均衡和熔断限流
负载均衡可以自己实现一个计分器和指标采集器对cpu,内存等打分随机 权重轮询ip hash等策略进行负载均衡。

限流最简单的是计数器还有平滑限流的滑动窗口、漏斗算法以及令牌桶算法等等。比如响应时间超过阈值那么接下来的时间窗口的服务都不接受。
一个服务 A 调用服务 B 时服务 B 的业务逻辑又调用了服务 C这时服务 C 响应超时服务 B 就可能会因为堆积大量请求而导致服务宕机由此产生服务雪崩的问题。

优雅开启优雅关闭
启动预热防止cache不热通过调用方通过服务发现获取服务提供方的启动时间 然后进行降权减少被负载均衡选择的概率从而实现预热过程。

总结:如何实现一个rpc框架
1、服务端、客户端、zk
先进行服务的注册和发现客户端注册服务端发现ip,port以及监听
客户端通过动态代理调用服务端的接口里面有远程调用逻辑,然后序列化协议传参数反序列化计算结果返回结果。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginxk8sDocker