天天看点

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(四)

本文为阿里云容器服务spring cloud应用开发系列文章的第四篇。

四、服务间通信与集成(本文)

服务之间的通信一般采用http+json协议,由于http的开销远大于本地调用,在调用的时候一定要注意服务间api的粒度。

在前文我们已经演示了如何利用eureka进行服务发现。在示例代码中,<code>foobar</code>服务需要通过http/json调用<code>foo</code>服务和<code>bar</code>服务。spring cloud提供及对http协议和json解析的支持,具体可以参见下面的代码示例:

resttemplate的声明需要加上<code>@autowired</code>和<code>@loadbalanced</code>两个注解。在随后对<code>resttemplate.getforobject</code>的调用传入服务的url。

其中<code>bar</code>服务名,<code>/message</code>为希望调用的url path。 <code>resttemplate.getforobject</code>从eureka中获得<code>bar</code>服务的所有实例,并根据内置的负载均衡算法选择一个实例调用并返回结果。

这段内容和前文介绍的服务发现和调用的内容一致,通过resttemplate可以完成服务的发现和调用(http协议)。springcloud提供的其它方式我们就不在这里讨论了。

本文的示例代码中没有演示消息通信,这部分内容以后会更新。

在build.gradle中添加如下内容可以将java项目对mysql的依赖包导入。

创建jpa访问数据库的interface,代码见<code>foo</code>服务的<code>inforepository.java</code>文件。

在代码中通过上面定义的interface访问数据库,代码见<code>foo</code>服务的<code>foocontroller.java</code>文件:

对数据的初始化部分就不在这里讨论了,读者可以根据自己的实际情况选择方案。

<code>foo</code>的代码演示如何访问mysql数据库,同样的代码也可以用于访问阿里云上的rds服务。

在application.yml中配置对mysql的访问信息。

<code>jdbc:mysql://mysql:3306/</code>中<code>mysql:3306</code>表示访问地址为mysql的3306端口。通过docker-compose启动服务的时候,可以通过docker compose文件指定mysql所具体对应的地址,可以是一个容器化的mysql镜像,也可以是阿里云上的rds服务。

访问mysql镜像,一般用于开发测试环境,文件为<code>docker-compose.yml</code>:

docker-compose为下载<code>registry.aliyuncs.com/acs-sample/mysql:5.7</code>镜像并创建一个mysql容器,<code>foo</code>通过<code>links</code>将自己要访问的mysql和实际的mysql关联起来。

如果要访问rds服务,则只需将mysql的<code>image</code>改为<code>external</code>,<code>foo</code>在docker compose文件中的配置不用更改。这部分内容存在docker-compose.acs.yml:

本文演示了spring cloud应用如何利用http进行同步通信,在数据库访问一节,讨论如何通过docker compose文件配置对mysql或rds的访问。