博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微服务实战(golang)
阅读量:6122 次
发布时间:2019-06-21

本文共 3276 字,大约阅读时间需要 10 分钟。

一.基础框架

1.iOS,安卓,web 等客户端先经过LB层,做负载均衡.

2.REST API 层提供对外接口,对于订单服务,可能有几个API接口.

3.每个API都可能调用基础服务层的几个服务,我们例子将使用gRPC来调用服务.

4.对于基础服务的数据操作这个模块,也可以不做,直接让基础服务模块访问数据库.

5.如果一个订单服务,只有查看订单跟下订单,数据操作的功能,那就把这三个功能归为一个微服务,对外是订单的REST API,专门负责处理订单的模块.

6.到后期会将一个微服务跑在一个docker上,所以可以看成每个微服务之间是相互隔离的,每个微服务将有自己的数据库.

以下是最简单的gRPC的例子,熟悉可以跳过:

github :

直接上例子:

helloworld.prpto相当于客服端和服务端订好的协议,写明要调用什么函数.

例子是客户端向服务端直接调用SayHello函数.

helloworld.proto

syntax = "proto3";option java_multiple_files = true;option java_package = "io.grpc.examples.helloworld";option java_outer_classname = "HelloWorldProto";package helloworld;// The greeting service definition.service Greeter {  // Sends a greeting  rpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the user's name.message HelloRequest {  string name = 1;}// The response message containing the greetingsmessage HelloReply {  string message = 1;}复制代码

终端命令 protoc --go_out=plugins=grpc:. helloworld.proto

生成 helloworld.pb.go 文件.

需要安装protoc,没有就去百度以下吧.

server.go

package mainimport (	"log"	"net"	"golang.org/x/net/context"	"google.golang.org/grpc"	pb "google.golang.org/grpc/examples/helloworld/helloworld"	"google.golang.org/grpc/reflection")const (	port = ":50051")// server is used to implement helloworld.GreeterServer.type server struct{}// SayHello implements helloworld.GreeterServerfunc (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {	return &pb.HelloReply{Message: "Hello " + in.Name}, nil}func main() {	lis, err := net.Listen("tcp", port)	if err != nil {		log.Fatalf("failed to listen: %v", err)	}	s := grpc.NewServer()	pb.RegisterGreeterServer(s, &server{})	// Register reflection service on gRPC server.	reflection.Register(s)	if err := s.Serve(lis); err != nil {		log.Fatalf("failed to serve: %v", err)	}}复制代码

client.go

package mainimport (	"log"	"os"	"time"	"golang.org/x/net/context"	"google.golang.org/grpc"	pb "google.golang.org/grpc/examples/helloworld/helloworld")const (	address     = "localhost:50051"	defaultName = "world")func main() {	// Set up a connection to the server.	conn, err := grpc.Dial(address, grpc.WithInsecure())	if err != nil {		log.Fatalf("did not connect: %v", err)	}	defer conn.Close()	c := pb.NewGreeterClient(conn)	// Contact the server and print out its response.	name := defaultName	if len(os.Args) > 1 {		name = os.Args[1]	}	ctx, cancel := context.WithTimeout(context.Background(), time.Second)	defer cancel()	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})	if err != nil {		log.Fatalf("could not greet: %v", err)	}	log.Printf("Greeting: %s", r.Message)}复制代码

二.服务发现与消息队列

以上的例子只是熟悉基本的gRPC,但是单一的订单微服务,client需要写死server的地址,不容易更改.当出现宕机,该服务就直接失效.为了能支持高容错,高并发,提供负载均衡.我们将引入服务发现etcd.

首先我们要开启etcd,关于细节可以多百度,关系etcd集群后面也会将.

1.所有gRPC服务都将通知到etcd.

2.当REST API 要用到 查看订单 和 下订单 的功能的时候,client会去etcd查看是否有该服务.

3.当发现etcd有对应的服务的时候,etcd会把对应的IP地址:端口号告诉client,client直接连接过去.

当有多个订单server的时候,etcd可以根据不同的策略提供负载均衡.

(例子在下面)

1.例子中,提供均衡轮询,我们开启两个server,一个client,显示client的请求平均的分布到两个server上.

2.当etcd关闭的时候,两个server一样能收到client的请求,但是重启server或者client,都会断开他们的联系.

3.如果只是断开一个server1,那client的请求就全部到另一个server2上.重启server1,也会自动恢复两个server请求均衡.

4.可以在命令行看etcd 服务

export ETCDCTL_API=3
etcdctl get --prefix=true "/etcd3_naming/hello_service"

一个 grpc 配合 etcd 的负载均衡例子链接:

5.了解后,我们来编写上图订单微服务:

转载地址:http://mjwua.baihongyu.com/

你可能感兴趣的文章
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>
面试总结
查看>>
Chrome浏览器播放HTML5音频没声音的解决方案
查看>>
easyui datagrid 行编辑功能
查看>>
类,对象与实例变量
查看>>
HDU 2818 (矢量并查集)
查看>>
【转】php字符串加密解密
查看>>
22. linux 常用命令
查看>>
ASP.Net 使用GridView模板删除一行的用法
查看>>
(十六)字段表集合
查看>>
JPGraph
查看>>
实验二 Java面向对象程序设计
查看>>
------__________________________9余数定理-__________ 1163______________
查看>>
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>