全部产品
云市场
云游戏

三方标准中间件对接

更新时间:2019-12-10 20:59:10

概念说明

应用开始对接前,需要先梳理整个应用系统,将应用分成一个或者多个“自研节点”和标准中间件。顾名思义,“自研节点”是指ISV自行开发的应用模块,通常是一个开发工程产出的执行体。
本产品文档所提及的“中间件”,是指可独立运行的系统组件,如MySQL、Redis、MongoDB数据库等。区别于系统所使用的技术框架,又与之有关。比如使用Dubbo作为开发框架,Dubbo本身不是本文所说的“中间件”,但是与Dubbo搭配使用的ZooKeeper,就是这里所谓的“中间件”。
目前,平台提供的中间件相关的节点分成两类:

  • 三方节点:这些中间件来自于标准的开源中间件镜像,平台本身并不修改或者保证该中间件本身的能力。
  • 初始化节点:这些节点只运行一次,他们并不是真正意义上的中间件,而仅仅完成中间件的一些初始化业务,平台层面会保证这些节点在应用部署运行的整个生命周期只会被成功执行一次。

部署与访问

对中间件节点的访问,一般情况下,直接使用该节点对“服务名称”作为地址即可;对中间件的部署,是平台支持情况,分成两种:

平台已支持

直接在可视化编排界面进行拖拽和配置即可,左侧即为支持的节点,中间部分为画布,右侧部分为节点属性,如下图所示:
配置图片

平台未支持

平台支持对中间件尚在不停的完善中,如果发现有不支持的中间件,可以联系相应的商务渠道进行沟通。当然,如果满足如下条件,ISV可以自行将中间件达成镜像包,作为自研节点供系统使用:

  • 应用中,对该中间件的使用,并不涉及到持久化,或者数据允许丢失,或者可以指定明确的持久化路径。
  • 应用中,对该中间件的使用,仅需要单节点使用,不使用集群或者高可用能力。

中间件通讯方式

操作系统 中间件类型 中间件名称 访问节点方式
Linux 阿里云中间件 IotEdge 固定的服务名称 iotedge
LinkVisual 固定的服务名称 linkvisual
三方中间件 RedisHA 使用 服务名称
SQL Server 使用 服务名称
Redis 使用 服务名称
MySQL-HA 使用 服务名称
RubbitMQ 使用 服务名称
Prometheus 使用 服务名称
Grafana 使用 服务名称
MySQL 使用 服务名称
InfluxDB 使用 服务名称

中间件环境变量说明

节点分类 环境变量字段 环境变量key 环境变量value
自研节点 应用appkey iot.hosting.appKey
应用appsecret iot.hosting.appSecret
IoT官方API调用域名 iot.hosting.api.domain
IoT官方API调用协议 iot.hosting.api.schema HTTP/HTTPS
IoT服务模型API调用域名 iot.hosting.mesh.domain
IoT服务模型API调用协议 iot.hosting.mesh.schema HTTP/HTTPS
redis-ha 服务地址 iot.hosting.${name}.redisUrl
登录密码 iot.hosting.${name}.redisPassword
sqlserver 数据库用户名 iot.hosting.${name}.mssqlUser
数据库密码 iot.hosting.${name}.mssqlPassword
数据库database iot.hosting.${name}.mssqlDatabase
redis 服务地址 iot.hosting.${name}.redisUrl
登录密码 iot.hosting.${name}.redisPassword
mysql-ha 服务地址 iot.hosting.${name}.mysqlHost
数据库database iot.hosting.${name}.mysqlDatabase
数据库密码 iot.hosting.${name}.mysqlPassword
数据库用户 iot.hosting.${name}.mysqlUser
数据库url iot.hosting.${name}.mysqlUrl jdbc:mysql://${name}:3306/${mysqlDatabase}
rabbitmq 服务地址 iot.hosting.${name}.rabbitmqHost
登录账户 iot.hosting.${name}.rabbitmqUsername
登录密码 iot.hosting.${name}.rabbitmqPassword
mysql 数据库用户名 iot.hosting.${name}.mysqlUser
数据库密码 iot.hosting.${name}.mysqlPassword
数据库database iot.hosting.${name}.mysqlDatabase
数据库地址 iot.hosting.${name}.mysqlUrl jdbc:mysql://${name}:3306/${mysqlDatabase}
influxdb 服务地址 iot.hosting.${name}.influxdbHost http://${name}:8086
数据库database iot.hosting.${name}.influxdbDatabase
数据库用户 iot.hosting.${name}.influxdbUser
数据库密码 iot.hosting.${name}.influxdbPassword

参数说明:
iot.hosting.${name}:指在应用配置中相应中间件的服务名称。

多副本应用部署

多副本部署目前仅支持RedisHA和MysqlHA的三方节点进行数据存储,在应用配置可选择副本数。如图所示:
多副本

MysqlHA实现步骤

  • 安装mysql应用
  • 在两个副本中创建slave同步账户,并授予对应的权限
  1. grant replication slave on *.* to 'slave'@'%' identified by 'Abcd@1234';
  2. flush privileges;
  • 配置数据库选项,参考配置如下:

实例1:

  1. server-id=1
  2. log-bin=mysql-bin
  3. relay-log=mysql-relay-bin
  4. log-slave-updates=on
  5. auto-increment-increment=2
  6. auto-increment-offset=1

实例2:

  1. server-id=2
  2. log-bin=mysql-bin
  3. relay-log=mysql-relay-bin
  4. log-slave-updates=on
  5. auto-increment-increment=2
  6. auto-increment-offset=2
  • 启动slave进程;
  1. #实例1
  2. CHANGE MASTER TO MASTER_HOST='192.168.99.118',MASTER_USER='slave',MASTER_PASSWORD='Abcd@1234';
  3. #实例2
  4. CHANGE MASTER TO MASTER_HOST='192.168.99.117',MASTER_USER='slave',MASTER_PASSWORD='Abcd@1234';

使用方式

初始化节点

与MySQL相同

JDBC连接

假设设置的mysql-ha服务名称为 mysqlha
端口为3306

JDBC URL

  1. jdbc:mysql://mysqlha-0.mysqlha:3306,mysqlha-1.mysqlha:3306/mysqlha?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=false

注意:

  • 需要填入两个地址,分别为主地址-0., 从地址-1.
  • 设置属性 autoReconnect=true&failOverReadOnly=false

JDBC连接池

建议使用JDBC连接池,示例代码

  1. public class DataSourceConfig {
  2. @Value("${datasource.url}")
  3. private String url;
  4. @Value("${datasource.username}")
  5. private String username;
  6. @Value("${datasource.password}")
  7. private String password;
  8. @Value("${datasource.max.active}")
  9. private int maxActive;
  10. @Value("${datasource.initial.size}")
  11. private int initialSize;
  12. @Bean(name = "dataSource")
  13. public DruidDataSource dataSource() {
  14. DruidDataSource novaDruidDataSource = new DruidDataSource();
  15. novaDruidDataSource.setUrl(url);
  16. novaDruidDataSource.setUsername(username);
  17. novaDruidDataSource.setPassword(password);
  18. novaDruidDataSource.setMaxActive(maxActive);
  19. novaDruidDataSource.setInitialSize(initialSize);
  20. novaDruidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  21. novaDruidDataSource.setValidationQuery("SELECT 1");
  22. novaDruidDataSource.setTestWhileIdle(true);
  23. novaDruidDataSource.setTimeBetweenEvictionRunsMillis(60000);
  24. return novaDruidDataSource;
  25. }
  26. @Bean(name = "sqlSessionFactory")
  27. public SqlSessionFactory sqlSessionFactory() throws Exception {
  28. WrapAndChangeConfigureSqlSessionFactory factory = new WrapAndChangeConfigureSqlSessionFactory();
  29. factory.setDataSource(dataSource());
  30. factory.setTypeHandlers(intEnumTypeHandlersFactory().getObject().toArray(new TypeHandler<?>[0]));
  31. return factory.getObject();
  32. }
  33. @Bean(name = "typeHandlerList")
  34. public IntEnumTypeHandlersFactoryBean intEnumTypeHandlersFactory() {
  35. IntEnumTypeHandlersFactoryBean typeHandlersFactoryBean = new IntEnumTypeHandlersFactoryBean();
  36. typeHandlersFactoryBean.setBasePackage("com.aliyun.iotx.bean");
  37. return typeHandlersFactoryBean;
  38. }
  39. @Bean(name = "dataSourceTransactionManager")
  40. public DataSourceTransactionManager dataSourceTransactionManager() {
  41. DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
  42. dataSourceTransactionManager.setDataSource(dataSource());
  43. return dataSourceTransactionManager;
  44. }
  45. @Bean(name = "jdbcTemplate")
  46. public JdbcTemplate jdbcTemplate() {
  47. JdbcTemplate jdbcTemplate = new JdbcTemplate();
  48. jdbcTemplate.setDataSource(dataSource());
  49. return jdbcTemplate;
  50. }
  51. }

实例demo

下载地址: