服务依赖

服务连接信息管理

连接信息的作用

当前服务被其他服务依赖时,如果需要注入相关变量给对方以方便对方连接自己。连接信息的实质是环境变量,只是其生效范围是自身和依赖自己的所有服务。比如一个MYSQL服务拥有连接信息 MYSQL_HOST、MYSQL_PORT、MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE。这些信息是其他服务连接 mysql的关键信息,当服务依赖mysql后会自动得到上诉的环境变量从而动态的获取到相关信息。

添加连接信息

连接信息完全可以在 服务管理-依赖管理 模块自定义添加和删除,当服务端口开启对内服务后,会自动生成 XXX_HOST XXX_PORT的变量信息,这类连接信息如果需要在 端口管理 模块点击端口别名进行修改。

服务依赖管理

服务为什么要依赖其他服务

当一个独立的业务系统不能完成所有功能时,就需要借助其他的服务来实现。如web服务一般都需要数据库存储数据,前端页面展现程序需要调用后端API服务获取数据等等。因此服务依赖的实质是建立与其他服务通信的链路。在Rainbond中,我们默认采用ServiceMesh的服务网络治理方式处理服务之间的通信,当服务需要请求其他服务时,必须显示的建立依赖关系,从而Rainbond将通过内置的服务注册和服务发现机制发现对方的服务地址,在当前服务的网络空间内建立起本地监听来负载均衡到目标服务的所有实例上。

graph LR; A[服务A] -->|127.0.0.1:8080 | C{envoy} C -->|192.168.0.1:8080 | D[服务B实例1] C -->|192.168.0.2:8080 | E[服务B实例2]

当服务未开启服务网络治理插件的情况下,Rainbond默认采用envoy 4层通信模型进行网络治理,开通治理插件即可在7层进行网络治理,设置更多路由或限流策略。

Rainbond中不管时内置服务还是第三方服务,通信维护方式都是一致的。

服务如何连接依赖服务

当服务开启对内服务后,其他服务才能通过【添加依赖服务】的方式进行关联,服务与依赖的服务建立起关联后,下一步就是连接依赖服务。

在【依赖】页面中的 【依赖应用信息】可以看到已经依赖的服务:

获取连接信息

选择其中一个依赖服务,点击【连接信息】会弹出连接信息页面:

连接信息分为两类:

  • 变量名 > 当服务的端口打开对内服务后,会生成一个默认的端口别名这个别名就是该服务的连接信息的前缀。如一个内部的API服务,端口别名是 USERAPI 则,其他服务与该API建立关联后,就可以通过 USERAPI_HOST 找到API服务的连接IP,通过USERAPI_PORT 找到API服务的端口号,如果还需要添加其他的变量名,可以通过 【依赖】–【服务连接信息】添加更多的依赖相关的变量。

  • 变量值 > 服务可以通过确定的变量值来连接被依赖(打开对内服务)的服务,我们不推荐使用这种方式连接,这种方式属于硬编码,所有配置都写死到代码中,对于业务安全与程序灵活性都有影响。我们推荐使用环境变量名的方式连接服务

服务连接依赖服务

当服务添加了依赖,并且查看了连接信息后,下一步就是修改服务的配置,连接依赖的服务,以Springcloud程序为例介绍通过环境变量的形式连接依赖的服务:

application.yml 文件

...
spring:
  data:
    mysql:
      host: ${MYSQL_HOST}
      username: ${MYSQL_USER}
      password: ${MySQL_PASS}
      database: ${MYSQL_DB}
      port: ${MYSQL_PORT}
...

其他各类语言都有获取环境变量的方法,如果不想用环境变量,也可以使用直接变量值,但按照十二要素原则,我们不推荐使用硬编码的方式连接服务。