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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文演示了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的访问。

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
27天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
50 2
|
1月前
|
专有云 Serverless 持续交付
亚太唯一,阿里云再度入选Gartner®容器管理魔力象限领导者
Gartner正式发布 2024《容器管理魔力象限》报告,阿里云再度成为中国唯一一家入选「领导者象限」的科技公司。
|
30天前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
27天前
|
人工智能 专有云 Serverless
亚太唯一!阿里云再度入选Gartner®容器管理魔力象限领导者
亚太唯一!阿里云再度入选Gartner®容器管理魔力象限领导者
104 2
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
阿里云开源 Spring AI Alibaba,旨在帮助 Java 开发者快速构建 AI 应用,共同构建物理新世界。
|
30天前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
1月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
40 1
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
42 1
|
1月前
|
安全 Java 对象存储
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
43 1
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
22 2

相关产品

  • 容器计算服务