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

开发者社区> libinjingshan> 正文

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

简介: 本文演示了Spring Cloud应用如何利用HTTP进行同步通信,在数据库访问一节,讨论如何通过docker compose文件配置对MySQL或RDS的访问。
+关注继续查看

服务间通信与集成

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

一、在阿里云容器服务上开发Spring Cloud微服务应用

二、部署Spring Cloud应用示例

三、服务发现

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

五、服务智能路由

六、集中配置管理

七、高可用和容错

八、监控和日志

九、服务的部署和发布策略

同步通信

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

服务同步调用(HTTP)

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

...
    @Autowired
    @LoadBalanced
    private RestTemplate restTemplate;

...
    private BarMessage getMessageFromBarService(){
        BarMessage bar = restTemplate.getForObject("http://bar/message", BarMessage.class);
        log.debug("From bar service : {}.", bar);
        return bar;
    }
...

RestTemplate的声明需要加上@Autowired@LoadBalanced两个注解。在随后对restTemplate.getForObject的调用传入服务的URL。

http://bar/message

其中bar服务名,/message为希望调用的URL Path。 restTemplate.getForObject从Eureka中获得bar服务的所有实例,并根据内置的负载均衡算法选择一个实例调用并返回结果。

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

WebSocket

WebSocket是一种基于TCP的轻量协议。对于交互响应要求高的应用,可以使用WebSocket协议在服务器和客户端之间进行通信,例如浏览器和服务之间的对话模式交互。在SpringCloud应用中使用WebSocket可以参见这篇文档:Using WebSocket to build an interactive web application

异步通信

异步通信机制可以将服务调用方和服务提供方解耦,基于消息或事件机制能够满足对实时性要求不特别高的场景。Spring Cloud中提供了对很多常见消息中间件的封装,例如对RabbitMQ的访问:Messaging with RabbitMQ,或者Redis访问:Messaging with Redis

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

数据库访问

build.gradle中配置对MySQL依赖

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

dependencies {
   ...
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    runtime('com.h2database:h2')
    runtime('mysql:mysql-connector-java')
    ...
}

数据库访问代码

创建JPA访问数据库的interface,代码见foo服务的InfoRepository.java文件。

public interface InfoRepository extends CrudRepository<Info, Long> {
    List<Info> findByName(String name);
}

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

    private String getInfoFromDatabase(){
        List<Info> infoList = infoRepository.findByName(KEY);
        for(Info info : infoRepository.findByName(KEY)) {
            return info.toString();
        }
        return "(no database info)";
    }

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

application.yml中配置对数据库的访问

foo的代码演示如何访问MySQL数据库,同样的代码也可以用于访问阿里云上的RDS服务。

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

spring:
  ...
  datasource:
    url: jdbc:mysql://mysql:3306/${{MYSQL_DATABASE}:foodb}
    username: ${{MYSQL_USERNAME}:user1}
    password: ${{MYSQL_PASSWORD}:passw0rd}
    testWhileIdle: true
    validationQuery: SELECT 1
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
      properties:
        hibernate:
          dialect: org.hibernate.dialect.MySQL5Dialect

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

在Docker Compose文件中创建或指定MySQL实例

访问MySQL镜像,一般用于开发测试环境,文件为docker-compose.yml

  mysql:
    image: registry.aliyuncs.com/acs-sample/mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=passw0rd
      - MYSQL_DATABASE=foodb
      - MYSQL_USER=user1
      - MYSQL_PASSWORD=passw0rd
  foo:
    image: xxx
    links:
      - mysql:mysql
    environment:
      ...
      - SPRING_PROFILES_ACTIVE=cloud
      - MYSQL_DATABASE=foodb
      - MYSQL_USERNAME=user1
      - MYSQL_PASSWORD=passw0rd

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

访问阿里云RDS

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

  mysql:
    external:
      host: ${rdsname}.mysql.rds.aliyuncs.com
      port: 3306
    environment:
      - MYSQL_ROOT_PASSWORD=passw0rd
      - MYSQL_DATABASE=foodb
      - MYSQL_USER=user1
      - MYSQL_PASSWORD=passw0rd

小节

本文演示了Spring Cloud应用如何利用HTTP进行同步通信,在数据库访问一节,讨论如何通过docker compose文件配置对MySQL或RDS的访问。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
前言 在上一篇文章中讨论了容器服务提供的交付能力,在本文中我们将讨论如何从零搭建一个持续交付系统。 对于大多数公司而言,选择一个合适自己的持续交付系统是尤为重要的一件事情,不同的公司、不同的业务使用的场景也各不相同,因此要根据自己的业务场景与发展方向来选择合适的方案。
8279 0
阿里云容器服务--自定义路由和负载均衡策略
阿里云容器服务已经提供了默认的简单路由服务来提供http请求的路由和负载均衡,但是对某些对路由和负载均衡有定制需求的用户来说,这往往不能满足用户的需求,下面我们就来介绍阿里云容器服务推出的自定义路由镜像acs/proxy
9777 0
免费 | 开发部署效率提升 12 倍,这款应用托管服务让云上运维更简单
应用托管服务,顾名思义,就是一个用来构建和部署应用的全托管式平台,简化部署和运维过程。 在使用应用托管服务之前,上线一款简单的应用,需要经历: 购买 ECS; 配置 VPC; 配置 RDS; 配置 SLB; 前前后后可能有12个步骤,而借助阿里云Web应用托管服务,可省去云端资源的申购与编排、软件运行时环境的安装与配置、应用程序的启停与维护、部署环境模板的分发与重放等多个环节,一步便能实现赢得上线。
2279 0
What is new? 阿里云 RDS for MySQL 8.0 上线 独家技术解读
原作者: 阿里云高级技术专家 冷香 MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL,全新的版本升级策略,安全和账号管理加强,InnoDB 功能增强等,目前小版本已经 release 到 8.0.16,新的功能仍然在持续推出。
3901 0
【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧
修炼Java,面试名企!本次课程,一起总结最新的Java Spring Boot 2.0面试题,以及阿里巴巴的招聘岗位,内推信息、面试技巧,最新的行业招聘信息。
2638 0
MyEclipse使用Docker的JavaEE开发
本文讲的是MyEclipse使用Docker的JavaEE开发【编者的话】本文主要讲述了如何在MyEclipse中通过Docker开发JavaEE程序。
2098 0
+关注
libinjingshan
李斌,目前负责阿里云容器服务解决方案的研发工作。加入阿里之前,李斌曾在IBM工作,专注于企业软件开发,DevOps,微服务和Docker实践。
24
文章
0
问答
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载