├── .gitignore ├── README.md ├── go-server ├── README.md ├── config.ini └── main.go ├── make.sh ├── meta └── sms.proto └── php-client ├── README.md ├── composer.json ├── demo.php └── src └── proto └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | ./php-client/idea/* 4 | php-client/.idea 5 | php-client/vendor 6 | php-client/composer.lock -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ###

grpc 阿里云短信发送服务

2 |

3 |   4 |   5 |   6 |   7 | 8 | 9 |

10 | 11 | --- 12 | 13 | golang中文入门教程: https://golangcaff.com/docs/the-way-to-go 14 | 15 | golang中文文档:http://doc.oschina.net/grpc 16 | 17 | grpc-go服务端文档:https://grpc.io/docs/quickstart/go.html 18 | 19 | protocol-buffers文档:https://developers.google.com/protocol-buffers/ 20 | 21 | php-grpc客户端文档:https://grpc.io/docs/quickstart/php.html 22 | 23 | ## 入门环境安装 24 | 1. 安装golang环境:https://golangcaff.com/docs/the-way-to-go/install-go-on-linux/8 25 | 2. 安装protoc环境:https://www.cnblogs.com/luoxn28/p/5303517.html 26 | 3. 安装grpc-go环境:https://www.jianshu.com/p/dba4c7a6d608 27 | 4. 安装php环境、grpc扩展、grpc_php_plugin插件:https://grpc.io/docs/quickstart/php.html 28 | 29 | 30 | ## grpc服务端 31 | 32 | * **生成pb.go文件** 33 | 34 | ```bash 35 | # --go_out 这里的地址是go类库地址,如果没有sms地址,请先创建地址才能正常生成 36 | # 这条命令会在类库的sms文件夹中生成 meta/sms.pb.go 文件 37 | 38 | protoc -I ./go-server/ --proto_path=./ --go_out=plugins=grpc:$GOPAHT/sms/ ./meta/sms.proto 39 | ``` 40 | 41 | * **修改main.go入口文件** 42 | 43 | ```golang 44 | package main 45 | 46 | import ( 47 | "golang.org/x/net/context" 48 | pb "local/sms/meta" //这里是生成的pb文件所在的路径(需修改) 49 | "github.com/fastgoo/alisms-go" 50 | "github.com/Unknwon/goconfig" 51 | "log" 52 | "net" 53 | "google.golang.org/grpc" 54 | "google.golang.org/grpc/reflection" 55 | ) 56 | 57 | const ( 58 | port = ":50051"//这里是设置端口 59 | ) 60 | 61 | type server struct{} 62 | 63 | var config map[string]string 64 | 65 | //编写服务方法 66 | func (s *server) Send(ctx context.Context, in *pb.Request) (*pb.Reply, error) { 67 | var defaultTemplate string 68 | if (in.Template != "") { 69 | defaultTemplate = in.Template; 70 | } else { 71 | defaultTemplate = config["defaultTemplate"]; 72 | } 73 | error := alisms.InitConfig("http://dysmsapi.aliyuncs.com", config["accessKeyId"], config["accessKeySecret"], config["signName"]).Send(in.Mobile, in.Params, defaultTemplate) 74 | if error != nil { 75 | return nil, error 76 | } 77 | return &pb.Reply{Code: 200, Msg: "发送成功"}, nil 78 | } 79 | 80 | // 加载配置文件 81 | func loadConfig(field string) { 82 | //这里的配置文件地址是我直接写死了我的真实地址,实际场景应该是使用相对地址(需修改) 83 | cfg, err := goconfig.LoadConfigFile("/Users/Mr.Zhou/Project/golang/grpc/go-server/config.ini") 84 | if err != nil { 85 | log.Println("读取配置文件失败[config.ini]") 86 | } 87 | value, _ := cfg.GetSection(field) 88 | config = value 89 | } 90 | 91 | func main() { 92 | //载入配置文件 93 | loadConfig("alisms") 94 | //监听tcp端口服务 95 | lis, err := net.Listen("tcp", port) 96 | if err != nil { 97 | log.Fatalf("failed to listen: %v", err) 98 | } 99 | s := grpc.NewServer() 100 | //注册grpc服务 101 | pb.RegisterSmsServer(s, &server{}) 102 | reflection.Register(s) 103 | if err := s.Serve(lis); err != nil { 104 | log.Fatalf("failed to serve: %v", err) 105 | } 106 | } 107 | 108 | ``` 109 | 110 | 111 | ## grpc php客户端 112 | * 生成php代码 113 | 114 | ```bash 115 | # --proto_path 为输出路径 116 | # --php_out 为生成PHP客户端代码所在的路径 117 | # --grpc_out 为生成PHP依赖文件所在的路径 118 | # --plugin 为PHP的插件路径(这个路径是grpc项目里面使用 make grpc_php_plugin 生成的路径) 119 | 120 | protoc --proto_path=./ --php_out=./php-client/src/proto/ --grpc_out=./php-client/src/proto/ --plugin=protoc-gen-grpc=/Users/Mr.Zhou/Project/PHP/grpc-master/bins/opt/grpc_php_plugin ./meta/sms.proto 121 | ``` 122 | 123 | * php客户端代码 124 | 125 | ```php 126 | require_once APP_DIR . '/vendor/autoload.php'; 127 | 128 | try { 129 | //初始化客户端 130 | $client = new \Sms\SmsClient("127.0.0.1:50051", [ 131 | 'credentials' => Grpc\ChannelCredentials::createInsecure() 132 | ]); 133 | //设置请求参数 134 | $request = new \Sms\Request(); 135 | $request->setParams(json_encode(['code' => '123456'])); 136 | $request->setMobile(15600087538); 137 | //$request->setTemplate("123"); 138 | 139 | //获取返回值,这里的$error是一个对象数组,如果code不是0则发送失败了 140 | //这里$reply 为Reply的实例对象 141 | //wait为阻塞等待服务端返回参数 142 | list($reply, $error) = $client->Send($request)->wait(); 143 | if ($error->code) { 144 | exit("发送失败,错误信息:" . $error->details); 145 | } 146 | var_dump($reply->getCode(), $reply->getMsg(), $reply->serializeToJsonString()); 147 | 148 | } catch (\Exception $exception) { 149 | var_dump($exception->getMessage()); 150 | } 151 | 152 | ``` 153 | 154 | * 安装composer依赖文件,执行客户端请求 155 | 156 | ```bash 157 | # 安装compsoer 依赖库 158 | composer install 159 | 160 | # 执行客户端代码 161 | php demo.php 162 | ``` 163 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /go-server/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastgoo/grpc-server/f6a666f080d7a1fcf9d1bb6591cc80f1e847d9ba/go-server/README.md -------------------------------------------------------------------------------- /go-server/config.ini: -------------------------------------------------------------------------------- 1 | [alisms] 2 | accessKeyId = 3 | accessKeySecret = 4 | signName = 5 | defaultTemplate = -------------------------------------------------------------------------------- /go-server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "golang.org/x/net/context" 5 | pb "local/sms/meta" 6 | "github.com/fastgoo/alisms-go" 7 | "github.com/Unknwon/goconfig" 8 | "log" 9 | "net" 10 | "google.golang.org/grpc" 11 | "google.golang.org/grpc/reflection" 12 | "path/filepath" 13 | "os" 14 | ) 15 | 16 | const ( 17 | port = ":9001" 18 | ) 19 | 20 | type server struct{} 21 | 22 | var alismsConfig map[string]string 23 | 24 | func (s *server) Send(ctx context.Context, in *pb.Request) (*pb.Reply, error) { 25 | var defaultTemplate string 26 | if (in.Template != "") { 27 | defaultTemplate = in.Template; 28 | } else { 29 | defaultTemplate = alismsConfig["defaultTemplate"]; 30 | } 31 | error := alisms.InitConfig("http://dysmsapi.aliyuncs.com", alismsConfig["accessKeyId"], alismsConfig["accessKeySecret"], alismsConfig["signName"]).Send(in.Mobile, in.Params, defaultTemplate) 32 | if error != nil { 33 | return nil, error 34 | } 35 | return &pb.Reply{Code: 200, Msg: "发送成功"}, nil 36 | } 37 | 38 | func main() { 39 | alismsConfig = loadConfig("alisms") 40 | lis, err := net.Listen("tcp", port) 41 | if err != nil { 42 | log.Fatalf("failed to listen: %v", err) 43 | } 44 | s := grpc.NewServer() 45 | pb.RegisterSmsServer(s, &server{}) 46 | reflection.Register(s) 47 | if err := s.Serve(lis); err != nil { 48 | log.Fatalf("failed to serve: %v", err) 49 | } 50 | } 51 | 52 | //获取当前运行路径,用于取配置文件 53 | func getDir() string { 54 | dir, err := filepath.Abs(filepath.Dir(os.Args[0])) 55 | if err != nil { 56 | log.Fatal(err) 57 | } 58 | return dir 59 | } 60 | 61 | // 加载配置文件 62 | // 这里如果是临时运行要注意写死地址,程序临时运行后会生成临时目录去运行,故而取不到config.ini 63 | // 编译后的程序就是正常的 64 | func loadConfig(field string) map[string]string { 65 | cfg, err := goconfig.LoadConfigFile(getDir() + "/config.ini") 66 | if err != nil { 67 | log.Println("读取配置文件失败[config.ini]") 68 | } 69 | value, _ := cfg.GetSection(field) 70 | return value 71 | } 72 | -------------------------------------------------------------------------------- /make.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | protoName=$2 3 | case $1 in 4 | 'go') 5 | libraryDir="/Users/Mr.Zhou/Project/golang/Libraries/src/local/" 6 | rm -rf ${libraryDir}${protoName} 7 | mkdir ${libraryDir}${protoName} 8 | protoc -I ./go-server/ --proto_path=./ --go_out=plugins=grpc:${libraryDir}${protoName} ./meta/$protoName.proto 9 | ;; 10 | 'php') 11 | phpPluginDir="/Users/Mr.Zhou/Project/PHP/grpc-master/bins/opt/grpc_php_plugin" 12 | phpDir="./php-client/src/proto/" 13 | protoc --proto_path=./ --php_out=$phpDir --grpc_out=$phpDir --plugin=protoc-gen-grpc=$phpPluginDir ./meta/$protoName.proto 14 | ;; 15 | esac 16 | 17 | -------------------------------------------------------------------------------- /meta/sms.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | package sms; 3 | 4 | service Sms { 5 | rpc Send (Request) returns (Reply) { 6 | } 7 | } 8 | 9 | message Request { 10 | string mobile = 1; 11 | string params = 2; 12 | string template = 3; 13 | } 14 | 15 | message Reply { 16 | int32 code = 1; 17 | string msg = 2; 18 | } -------------------------------------------------------------------------------- /php-client/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastgoo/grpc-server/f6a666f080d7a1fcf9d1bb6591cc80f1e847d9ba/php-client/README.md -------------------------------------------------------------------------------- /php-client/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "grpc/grpc": "*", 4 | "google/protobuf": "^v3.5.0" 5 | }, 6 | "autoload": { 7 | "psr-4": { 8 | "GrpcClient\\": "src/" 9 | }, 10 | "classmap": [ 11 | "src/proto/" 12 | ] 13 | } 14 | } -------------------------------------------------------------------------------- /php-client/demo.php: -------------------------------------------------------------------------------- 1 | Grpc\ChannelCredentials::createInsecure() 17 | ]); 18 | $request = new \Sms\Request(); 19 | $request->setParams(json_encode(['code' => '123456'])); 20 | $request->setMobile(15600087538); 21 | //$request->setTemplate("123"); 22 | 23 | list($reply, $error) = $client->Send($request)->wait(); 24 | if ($error->code) { 25 | exit("发送失败,错误信息:" . $error->details); 26 | } 27 | var_dump($reply->getCode(), $reply->getMsg(), $reply->serializeToJsonString()); 28 | 29 | } catch (\Exception $exception) { 30 | var_dump($exception->getMessage()); 31 | } -------------------------------------------------------------------------------- /php-client/src/proto/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fastgoo/grpc-server/f6a666f080d7a1fcf9d1bb6591cc80f1e847d9ba/php-client/src/proto/README.md --------------------------------------------------------------------------------