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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文演示了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的访问。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
弹性计算 Java 关系型数据库
最佳实践:阿里云倚天ECS在千寻位置时空智能服务的规模化应用
当前,千寻已有上千台倚天ECS实例在支撑线上核心业务。
|
1天前
|
弹性计算 运维 Java
最佳实践:阿里云倚天ECS在千寻位置时空智能服务的规模化应用
阿里云、平头哥及安谋科技联合举办的飞天技术沙龙探讨了倚天Arm架构在业务创新中的应用。活动中,千寻位置运维专家分享了将核心业务迁移到倚天处理器ECS实例的成功案例,强调了倚天处理器的高能效比和降本增效优势。迁移过程涉及操作系统、CICD系统和监控系统的适配,以及业务系统的性能测试。目前,千寻已迁移了上千台ECS实例到倚天处理器,实现了成本和效率的显著提升。未来计划继续扩展倚天处理器在核心业务和K8S中的应用。
|
1天前
|
弹性计算 运维 负载均衡
【阿里云弹性计算】阿里云ECS在金融科技中的应用案例:高性能交易系统的构建
【5月更文挑战第27天】阿里云ECS助力某证券公司构建高性能交易系统,满足高并发、高可用和弹性扩展需求。ECS凭借最新处理器技术、高速内存实现高性能计算;支持多地域、多可用区部署保证高可用性;弹性伸缩特性适应业务波动,降低运维成本。通过分布式架构和负载均衡技术,实现交易请求高效处理,确保系统稳定运行。案例证明,阿里云ECS是金融科技领域构建高性能交易系统的理想选择。
10 1
|
1天前
|
Cloud Native 安全 Serverless
【阿里云云原生专栏】低代码开发在云原生平台的应用:阿里云低代码服务探索
【5月更文挑战第27天】在云原生时代,低代码开发凭借其图形化界面和预构建模块,简化了应用开发,提升了效率。阿里云积极探索低代码领域,推出函数计算FC和应用配置中心ACM等服务。FC让开发者无需关注基础设施,仅需少量代码即可实现应用部署,而ACM则提供动态配置管理,增强应用灵活性。阿里云的这些服务为企业数字化转型提供了高效、安全的解决方案,预示着低代码开发在云原生平台上的重要地位。
15 1
|
8月前
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
6月前
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
93 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
|
13天前
|
Java 中间件 开发者
Spring Cloud Alibaba
【1月更文挑战第27天】【1月更文挑战第127篇】Spring Cloud Alibaba
84 1
|
9月前
|
Java Nacos Sentinel
Spring Cloud Alibaba学习指南
由于在2018年Netflix公司宣布对其核心组件Hystrix、Ribbon、zuul、Eureka等进入维护状态,也就是Spring Cloud Netflix系列。由此Spring Cloud Alibaba就诞生了,值得注意的是Spring Cloud Alibaba完全兼容了Spring Cloud Netflix中的Ribbon、Feign、Eureka等组件,所以基于Spring Cloud Netflix的项目可以无缝迁移到Spring Cloud Alibaba。
440 0
|
13天前
|
消息中间件 Java Maven
Spring Cloud Alibaba 简介
Spring Cloud Alibaba 简介
205 1
|
13天前
|
消息中间件 负载均衡 Java
【从Spring Cloud到Spring Cloud Alibaba,这些改变你都知道吗?】—— 每天一点小知识
【从Spring Cloud到Spring Cloud Alibaba,这些改变你都知道吗?】—— 每天一点小知识
【从Spring Cloud到Spring Cloud Alibaba,这些改变你都知道吗?】—— 每天一点小知识

相关产品

  • 容器计算服务