在阿里云容器服务上开发基于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;
    }
...
AI 代码解读

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

http://bar/message
AI 代码解读

其中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')
    ...
}
AI 代码解读

数据库访问代码

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

public interface InfoRepository extends CrudRepository<Info, Long> {
    List<Info> findByName(String name);
}
AI 代码解读

在代码中通过上面定义的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)";
    }
AI 代码解读

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

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
AI 代码解读

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
AI 代码解读

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
AI 代码解读

小节

本文演示了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搭建和管理企业级网站应用
目录
打赏
0
0
0
0
78540
分享
相关文章
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
66 6
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
148 0
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
127 7
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
257 6
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
116 1
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
379 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2

相关产品

  • 容器计算服务