0. 前言

  • 原文参考:Golang 微服务教程(六)
  • 上节使用 go-micro 搭建了微服务的事件驱动架构
  • 本节将介绍 web 客户端的角度出发如何与微服务进行调用交互

1. 微服务与 web 端交互参

  • 参考 go-micro 文档,可看到 go-micro 实现了为 web 客户端代理请求 RPC 方法的机制

1.1 内部调用

  • 微服务 A 调用微服务 B 的方法,需要先实例化再调用:bClient.CallRPC(args...)
  • 数据作为参数传递,属于内部调用

1.2 外部调用

  • web 端浏览器是通过 HTTP 请求去调用微服务的方法,go-micro 就做了中间层
  • 调用方法的数据以 HTTP 请求的方式提交,属于外部调用

2. REST vs RPC

  • REST 风格多年来在 web 开发领域独领风骚
  • 常用于客户端与服务端进行资源管理,应用场景比 RPC 和 SOAP 都要广得多
  • 更多参考:知乎:RPC 与 RESTful API 对比

2.1 REST

  • REST 风格对资源的管理既简单又规范
  • 它将 HTTP 请求方法对应到资源的增删改查上
  • 同时还可以使用 HTTP 错误码来描述响应状态
  • 在大多数 web 开发中 REST 都是优秀的解决方案

2.2 RPC

  • 近年来 RPC 风格也乘着微服务的顺风车逐渐普及开来
  • REST 适合同时管理不同的资源,不过一般微服务只专注管理单一的资源
  • 使用 RPC 风格能让 web 开发专注于各微服务的实现与交互

3. Micro 工具箱

  • 之前一直在使用 go-micro 框架,现在来看看它的 API 网关
  • go-micro 提供 API 网关给微服务做代理
  • API 网关把微服务 RPC 方法代理成 web 请求,将 web 端使用到的 URL 开放出来,更多参考:go-micro toolkitsgo-micro API example
  • 执行 go get -u github.com/micro/micro 安装 go-mirco 工具箱
  • 执行 docker pull microhq/micro,拉取镜像
  • 修改 docker-compose.yaml:

go连接mysql cluster go连接微服务_微服务

go连接mysql cluster go连接微服务_REST_02

version: '3.1'

services:
  consignment-cli:
    build: ./consignment-cli
    environment:
      MICRO_REGISTRY: "mdns"

  consignment-service:
    build: ./consignment-service
    ports:
      - 50051:50051
    environment:
      MICRO_ADRESS: ":50051"
      MICRO_REGISTRY: "mdns"
      DB_HOST: "datastore:27017"
    depends_on:
      - datastore

  vessel-service:
    build: ./vessel-service
    ports:
      - 50052:50051
    environment:
      MICRO_ADRESS: ":50051"
      MICRO_REGISTRY: "mdns"
      DB_HOST: "datastore:27017"
    depends_on:
      - datastore

  user-service:
    build: ./user-service
    ports:
      - 50053:50051
    environment:
      MICRO_ADRESS: ":50051"
      MICRO_REGISTRY: "mdns"
      DB_NAME: "postgres"
      DB_HOST: "database"
      DB_PORT: "5432"
      DB_USER: "postgres"
      DB_PASSWORD: "postgres"
      MICRO_BROKER: "nats"
      MICRO_BROKER_ADDRESS: "mq"
    depends_on:
      - database
      - mq
      - micro

  email-service:
    build: ./email-service
    ports:
      - 50054:50051
    environment:
      MICRO_ADRESS: ":50051"
      MICRO_REGISTRY: "mdns"
      MICRO_BROKER: "nats"
      MICRO_BROKER_ADDRESS: "mq"
    depends_on:
      - mq

  user-cli:
    build: ./user-cli
    environment:
      MICRO_REGISTRY: "mdns"

  datastore:
    image: mongo
    ports:
      - 27017:27017

  database:
    image: postgres
    ports:
      - 5432:5432

  mq:
    image: nats
    ports:
      - 4222:4222

  micro:
    command: api --handler=rpc --namespace=go.micro.srv
    image: microhq/micro:latest
    ports:
      - 8080:8080

View Code

  • 添加 microhq/micro 镜像作为 user-service 的依赖镜像
  • 通过 postman 测试 web 接口:

go连接mysql cluster go连接微服务_REST_03

4. 总结

  • 至此参考 Golang 微服务系列教程总结,学习了 Golang 下微服务的基本操作
  • 首先要定义 proto 文件,然后根据编译生成的 *.pb.go 文件实现相应的业务接口
  • 完善相关逻辑并拆分代码
  • 可以根据 docker-compose.yaml 统一管理各个微服务,可以定义环境变量和镜像依赖关系

5. 参考文献