問題
モバイルアプリケーションの開発では、通常、サーバー上の複雑なビジネスロジックを達成すると、クライアントは、プレゼンテーション層のための唯一の責任です。しかし、いくつかの携帯電話アプリケーションのための、ビジネス・ロジックは、サーバー上にありますが、安全ではないか無理があるが、それは、電話論理エンドで直接に実現する必要があります。
目的
フェイス異なるモバイル・クライアント・システムで、別のは、同じビジネスロジックではなく、ベストプラクティスを実現するために繰り返します。ゴー言語のビジネスロジックは、ライブラリにカプセル化されたサードパーティ製の言語、および異なるシステムを使用するモバイルクライアントを提供するために、静的なパックされた道を形成する方法、それはこの調査の目的です。
理想的なゴールグラフ:
具体的な研究内容は以下のとおりです。
- [X-] iOSアプリケーションはgRPCコールを達成するために
- [X-] AndroidのアプリケーションはgRPCコールを実装
- [] GoMobile SDKは、iOS&Androidの上に集積しました
- iOSの&アンドロイドの[] GoMobile SDKの境界
- [] C / Sアーキテクチャまたは静的ライブラリ
gRPCについてのiOSとAndroidを達成するもので、それ自体は公式にはサンプルを提供してきました。調査では、関連するコンテンツを使用しますので、それを読むために、後のものを容易にするための研究の一環として記録されます。研究プロジェクトのコードに関わるすべてのに格納されています。liujianping / GRPC-アプリの倉庫、困っている友達は、直接テストでダウンロードすることができます。
:私の個人的なサイトのオリジナルリリースでGitDiG.comの説明リンク:. gRPCコールを達成するためのiOSアプリケーション。
1.インストール環境
パートタイムとしてのiOSプログラマは、多くの場合、不慣れな技術や言語を研究する必要があります。最初は、未知の心理的な恐怖を克服することです。実際には、それほど難しいことではない、物事の多くは、ちょうどそれを起動する必要があります。研究目的を完了するためには、研究活動の最初の部分が始まりました。新規参入を容易にするため、書面で記録されます。
1.1 XCodeのインストール
直接AppStoreのは、ダウンロードしてインストール、何も言うことはありません。他の環境を準備ダウンロード中に、少し遅いです。
1.2 Cocoapodインストール
他の言語、サードパーティ製のデータベース管理ツールのように。私は言う、公式ウェブサイトを訪問、インストールするための指示に従うことは何もありません。
$: sudo gem install cocoapods
1.3 protocは、インストールするコマンド
なぜなら普及gRPCの、いるProtobufバイトプロトコルが広く、特定のガイドラインを参照して、符号化及び復号化のプロトコルのために使用される[公式サイト]()。いくつかの単語の男は、インストールを言いました:
$: curl -LOk https://github.com/protocolbuffers/protobuf/releases/download/v3.5.1/protoc-3.9.0-rc-1-osx-x86_64.zip
$: unzip protoc-3.9.0-rc-1-osx-x86_64.zip -d proto_buffer && cd proto_buffer
$: sudo cp bin/protoc /usr/local/bin
$: sudo cp -R include/google/protobuf/ /usr/local/include/google/protobuf
$: protoc --version
1.4 protocプラグインのインストール
protoc主に解析することによって.proto
、ファイル形式とは、特定のウィジェットに応じて対応する言語コードを生成します。
アカウントにコードのクライアントとサーバを実装する必要性を取るので、あなたは、以下の3つのプラグインをインストールする必要があります。
- 迅速
- swiftgrpc
- サービス側を実装するために主に生成されたコードを行く行きます
迅速なプラグインをインストール:
$: git clone https://github.com/grpc/grpc-swift.git
$: cd grpc-swift
$: git checkout tags/0.5.1
$: make
$: sudo cp protoc-gen-swift protoc-gen-swiftgrpc /usr/local/bin
プラグインがインストールされて行きます。
公式ウェブサイトを参照して、囲碁言語開発環境をインストールする必要があることを条件とします。protoc-gen-go
詳細なインストールガイド。
$: go get -u github.com/golang/protobuf/protoc-gen-go
2プロト定義されたインタフェース
それが最も簡単なのHelloサービスの利用に関する最も簡単な研究があるので。プロジェクトを作成し、パスを定義します。
$: mkdir grpc-apps
$: cd grpc-apps
$: mkdir proto
$: cat <<EOF > proto/hello.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.gitdig.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
EOF
3.サービス側の実装
プロジェクトディレクトリとプロトビルドディレクトリにサーバーのディレクトリを作成し、簡単なサーバを書きます:
$: cd grpc-apps
$: mkdir go go/client go/server go/hello
# 生成 Go 代码到 go/hello 文件夹
$: protoc -I proto proto/hello.proto --go_out=plugins=grpc:./go/hello/
クライアントとサーバーの実装の両方のバージョンを編集してください。サービスが正常に動作していることを確認します。
3.1ゴー・サーバ
編集しserver/server.go
たファイルを:
package main
import (
pb "github.com/liujianping/grpc-apps/go/helloworld"
)
import (
"context"
"fmt"
"log"
"net"
"google.golang.org/grpc"
)
type HelloServer struct{}
// SayHello says 'hi' to the user.
func (hs *HelloServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
// create response
res := &pb.HelloReply{
Message: fmt.Sprintf("hello %s from go", req.Name),
}
return res, nil
}
func main() {
var err error
// create socket listener
l, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("error: %v\n", err)
}
// create server
helloServer := &HelloServer{}
// register server with grpc
s := grpc.NewServer()
pb.RegisterGreeterServer(s, helloServer)
log.Println("server serving at: :50051")
// run
s.Serve(l)
}
サーバープログラムを実行します。
$: cd grpc-apps/go
$: go run server/server.go
2019/07/03 20:31:06 server serving at: :50051
3.2囲碁クライアント
編集しclient/client.go
たファイルを:
package main
import (
pb "github.com/liujianping/grpc-apps/go/helloworld"
)
import (
"context"
"fmt"
"log"
"google.golang.org/grpc"
)
func main() {
var err error
// connect to server
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("error: %v\n", err)
}
defer conn.Close()
// create client
client := pb.NewGreeterClient(conn)
// create request
req := &pb.HelloRequest{Name: "JayL"}
// call method
res, err := client.SayHello(context.Background(), req)
if err != nil {
log.Fatalf("error: %v\n", err)
}
// handle response
fmt.Printf("Received: \"%s\"\n", res.Message)
}
クライアントプログラムを実行します。
$: cd grpc-apps/go
$: go run client/client.go
Received: "hello JayL from go"
クライアント/サーバ間の通信が成功した移動します。
4. iOSのプロジェクト
4.1単純な単一のビューのプロジェクトを作成します
iosDemo単一のビューと呼ばれるプロジェクトを作成し、迅速な言語を選択し、上のストレージ・パスgrpc-apps
の次。あなたは、作成、実行が終了したら、プログラムを終了します。
4.2プロジェクトの初期ポッド
コマンドラインの初期化中:
$: cd grpc-apps/iosDemo
# 初始化
$: pod init
$: vim Podfile
編集Podfile次のように:
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'iosDemo' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for iosDemo
pod 'SwiftGRPC'
end
あなたが編集、保存が完了したら、インストールのコマンドを実行します。
$: pod install
インストールが完了したら、プロジェクトディレクトリには、以下の変更を行われます。
$: git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: iosDemo.xcodeproj/project.pbxproj
Untracked files:
(use "git add <file>..." to include in what will be committed)
Podfile
Podfile.lock
Pods/
iosDemo.xcworkspace/
no changes added to commit (use "git add" and/or "git commit -a")
コマンドラインopen iosDemo.xcworkspace
プロジェクトを開くには、プロジェクト内の以下の設定を変更することがinfo.list:
設定することで、非セキュアHTTPアクセスを開きます。
4.3コード生成gRPC SWIFT
同様に、コード生成を行く、今SWIFTは、コードを生成します。
$: cd grpc-apps
# 创建生成文件存放目录
$: mkdir swift
# 生成 swift 文件
$: protoc -I proto proto/hello.proto \
--swift_out=./swift/ \
--swiftgrpc_out=Client=true,Server=false:./swift/
# 生成文件查看
$: tree swift
swift
├── hello.grpc.swift
└── hello.pb.swift
4.4は、iOSプロジェクトに統合されたコードを生成し、
XCodeのは、バックエンドの開発のための道をドラッグして追加するために必要なコードを生成し、それは少し無理があります。しかし、これ以来、私たちはルールに従わなければなりません。
今gRPCは、iOS用のビューの読み込み機能でプロシージャを呼び出す追加します。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let client = Helloworld_GreeterServiceClient(address: ":50051", secure: false)
var req = Helloworld_HelloRequest()
req.name = "JayL"
do {
let resp = try client.sayHello(req)
print("resp: \(resp.message)")
} catch {
print("error: \(error.localizedDescription)")
}
}
}
ログ出力を表示しresp: hello iOS from go
、成功したiOSアプリケーションはgRPCサービスを呼び出します。