本人最近几年一直在学习并且实践云原生,也从测试转型到DevOps,公司的所有服务也从数据中心搬到云端,回顾过去几年学到的知识,觉得是时候总结一下了,所以准备以云原生为题材写下这一过程中所有学到的知识点,希望对大家有所帮助。
在我带你开始云原生之旅前,需要入门一下golang,没办法,谁让它是云原生领域里正红的发紫的“角儿,从最底层的 containerd,到编排层的 Kubernetes,再到如今正红的发紫的 Istio,随便拿出一个来都是golang写的。我相信你学了Golang之后,会发现它非常好用,library丰富,部署简单,容易上手,咱也不想成为资深开发,但我们自动化,写工具之类的还是需要掌握一门语言的,我反正已经放弃其它学过的语言了。
本篇文章讲述如何构建一个简单的HTTP服务器,Golang的标准库net/http 让这一切变得很容易,仅适用于golang新手(已了解过Golang语言特性)。
关键词:Golang,入门,HTTP server,DevOps,云原生,Golang 例子
让我们用Pizza餐厅点单作为例子,定义 Pizza 餐厅 API 3个endpoints 如下:
/pizzas /orders /orders代码如下:
1 package main
2
3 import (
4 "encoding/json"
5 "fmt"
6 "log"
7 "net/http"
8 )
9
10 type Pizza struct {
11 ID int `json:"id"`
12 Name string `json:"name"`
13 Price int `json:"price"`
14 }
15
16 type Pizzas []Pizza
17
18 func (ps Pizzas) FindByID(ID int) (Pizza, error) {
19 for _, pizza := range ps {
20 if pizza.ID == ID {
21 return pizza, nil
22 }
23 }
24
25 return Pizza{}, fmt.Errorf("couldn't find pizza with ID: %d", ID)
26 }
27
28 type Order struct {
29 PizzaID int `json:"pizza_id"`
30 Quantity int `json:"quantity"`
31 Total int `json:"total"`
32 }
33
34 type Orders []Order
35
36 type pizzasHandler struct {
37 pizzas *Pizzas
38 }
39
40 func (ph pizzasHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
41 w.Header().Set("Content-Type", "application/json")
42
43 switch r.Method {
44 case http.MethodGet:
45 if len(*ph.pizzas) == 0 {
46 http.Error(w, "Error: No pizzas found", http.StatusNotFound)
47 return
48 }
49
50 json.NewEncoder(w).Encode(ph.pizzas)
51 default:
52 http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
53 }
54 }
55
56 type ordersHandler struct {
57 pizzas *Pizzas
58 orders *Orders
59 }
60
61 func (oh ordersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
62 w.Header().Set("Content-Type", "application/json")
63
64 switch r.Method {
65 case http.MethodPost:
66 var o Order
67
68 if len(*oh.pizzas) == 0 {
69 http.Error(w, "Error: No pizzas found", http.StatusNotFound)
70 return
71 }
72
73 err := json.NewDecoder(r.Body).Decode(&o)
74 if err != nil {
75 http.Error(w, "Can't decode body", http.StatusBadRequest)
76 return
77 }
78
79 p, err := oh.pizzas.FindByID(o.PizzaID)
80 if err != nil {
81 http.Error(w, fmt.Sprintf("Error: %s", err), http.StatusBadRequest)
82 return
83 }
84
85 o.Total = p.Price * o.Quantity
86 *oh.orders = append(*oh.orders, o)
87 json.NewEncoder(w).Encode(o)
88 case http.MethodGet:
89 json.NewEncoder(w).Encode(oh.orders)
90 default:
91 http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
92 }
93 }
94
95 func main() {
96 var orders Orders
97 pizzas := Pizzas{
98 Pizza{
99 ID: 1,
100 Name: "Veggie",
101 Price: 12,
102 },
103 Pizza{
104 ID: 2,
105 Name: "Cheese",
106 Price: 11,
107 },
108 Pizza{
109 ID: 3,
110 Name: "Meat",
111 Price: 10,
112 },
113 }
114
115 mux := http.NewServeMux()
116 mux.Handle("/pizzas", pizzasHandler{&pizzas})
117 mux.Handle("/orders", ordersHandler{&pizzas, &orders})
118
119 log.Fatal(http.ListenAndServe(":8080", mux))
120 }
pizzas 和 orders 数据都保留在内存中,为了尽可能简单,没有任何数据存储持久化,如果需要,我可以开设另一篇来讲 gorm 之类的,也是现学的 :)
也不检查请求的header,客户端发的data body
本地启动
go run main.go
### https://www.cnblogs.com/wade-xu/p/16705918.html ###
调用 get all pizzas 接口

创建一个 order 订4个 Veggie pizzas
curl -X POST localhost:8080/orders -d '{"pizza_id":1,"quantity":4}' | jq

再创建一个Order 订2个 Cheese pizzas
curl -X POST localhost:8080/orders -d '{"pizza_id":2,"quantity":2}' | jq
{
"pizza_id": 2,
"quantity": 2,
"total": 22
}
最后 Get orders 看下
Simple HTTP server works well.
### https://www.cnblogs.com/wade-xu/p/16705918.html ###
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear