03-微服务技术栈(基础):SpringCloud工程部署启动

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本节笔者带领大家完成了SpringCloud工程从0->1的搭建,当然你不想搭建也可以直接采用方案一,二者等效,至此读者们完成了一个微服务工程的搭建、部署、访问。同时在本节最后一章,笔者基于RestTemplate发起的http请求实现远程调用,实现当A系统想要获取B系统数据时的跨系统数据交互。然而RESTful API访问并不是微服务的唯一解决方案,如Dubbo的交互一样可以实现,希望读者们能不限于此。

1.工程搭建部署

方案一:完整工程导入

方案二:从零开始搭建

1.工程与module创建

1.1 父工程创建

1.2 子module创建

  • module名称:order-service、user-service
  • 无效文件夹删除,整体结构如图2

1.3 父pom资源引入

粘贴以下资源依赖,粘贴后maven会自动拉取依赖,如未拉取请手动刷新

   org.springframework.boot

   spring-boot-starter-parent

   2.3.9.RELEASE

 


   UTF-8

   UTF-8

   1.8

   Hoxton.SR10

   5.1.47

   2.1.1

   1.18.20


 

     

     

           org.springframework.cloud

           spring-cloud-dependencies

           ${spring-cloud.version}

           pom

           import

     

     

     

           mysql

           mysql-connector-java

           ${mysql.version}

     

     

     

           org.mybatis.spring.boot

           mybatis-spring-boot-starter

           ${mybatis.version}

     

     

           org.projectlombok

           lombok

           ${lombok.version}

     

 

1.4 子module资源引入

user-service

 

       org.springframework.boot

       spring-boot-starter-web

 

 

       mysql

       mysql-connector-java

 

 

 

       org.mybatis.spring.boot

       mybatis-spring-boot-starter

 

 

       org.projectlombok

       lombok

 

   app

 

     

           org.springframework.boot

           spring-boot-maven-plugin

     

 

order-service

 

       org.springframework.boot

       spring-boot-starter-web

 

 

       mysql

       mysql-connector-java

 

 

 

       org.mybatis.spring.boot

       mybatis-spring-boot-starter

 

 

       org.projectlombok

       lombok

 

 

     

           org.springframework.boot

           spring-boot-maven-plugin

     

 

1.5 业务代码编写

1.user-service的application.yml配置文件

server:

 port: 8081

spring:

 datasource:

   url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false

   username: root

   password: root123456

   driver-class-name: com.mysql.jdbc.Driver

mybatis:

 type-aliases-package: cn.itcast.user.pojo

 configuration:

   map-underscore-to-camel-case: true

logging:

 level:

   cn.itcast: debug

 pattern:

   dateformat: MM-dd HH:mm:ss:SSS

|--mapper

|-- UserMapper

package cn.itcast.user.mapper;


import cn.itcast.user.pojo.User;

import org.apache.ibatis.annotations.Param;

import org.apache.ibatis.annotations.Select;


/**

* 用户持久层

*

* @author

* @date 2022-12-22 14:12

*/

public interface UserMapper {


   /**

    * 根据ID查找用户

    * @param id    用户ID

    * @return      用户实体信息

    */

   @Select("select * from tb_user where id=#{id}")

   User findById(@Param("id") Long id);

}

|--pojo

|-- User

package cn.itcast.user.pojo;


import lombok.Data;


/**

* 用户实体

*

* @author

* @date 2022-12-22 14:07

*/

@Data

public class User {


   /**

    * 主键ID

    */

   private Long id;


   /**

    * 用户姓名

    */

   private String username;


   /**

    * 用户地址

    */

   private String address;

}

service

|-- UserService

package cn.itcast.user.service;


import cn.itcast.user.mapper.UserMapper;

import cn.itcast.user.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


import java.util.Objects;


/**

* 用户业务层

*

* @author

* @date 2022-12-22 14:13

*/

@Service

public class UserService {


   @Autowired

   private UserMapper userMapper;


   /**

    * 根据ID查找用户

    * @param id    用户ID

    * @return      用户实体信息

    */

   public User findById(Long id) {

       if (Objects.isNull(id)) {

           return null;

       }

       return userMapper.findById(id);

   }


}

2.数据库导入

导完如下

3.项目启动

3.1 启动并访问user-service

3.2 启动并访问order-service

观察发现,虽然order-service服务调用成功,但是里面的user对象却是空的。原因我们应该也可以了解到是因为User对象数据数存储在数据库:tb_user,而此工程连接数据库是:tb_order,查询此数据库时无法获取对应的User数据,怎么获取?获取的具体实现我们将在下一章节进一步铺开。

4.服务远程调用

分析现有链路调用关系可以发现:

想要订单信息中返回用户信息,只要在获取订单链路中追加对用户信息的获取、返回值的组装即可,由此引申出微服务之间的远程服务调用,具体调整可见下图。

时序图说明

上述图形为时序图,一般用来描述系统与系统之间的交互流程,主要是交互API、代码顺序、参数一般忽略,时序图不同于业务流程,更关注业务实现过程中系统前后依赖,数据请求与返回,以下为笔者实际工作场景示例:


服务远程调用实现

注入RestTemplate

此处推荐一个小的优雅工具:https://carbon.now.sh/

RestTemplate完成远程服务调用

在此笔者除了完成远程服务调用,同时对代码做了结构化、异常校验、函数封装。虽然此处逻辑并不复杂,但是对于主干逻辑简化和代码风格,希望能起到一个引导作用。

package cn.itcast.order.service;


import cn.itcast.order.mapper.OrderMapper;

import cn.itcast.order.pojo.Order;

import cn.itcast.order.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;


import java.util.Objects;


/**

* 订单业务层

*

* @author

* @date 2022-12-22 14:24

*/

@Service

public class OrderService {


   @Autowired

   private OrderMapper orderMapper;


   @Autowired

   private RestTemplate restTemplate;


   /**

 * 根据ID查找订单

    * @param id    订单ID

    * @return      订单对象

    */

   public Order findById(Long id) {


       // step 1 : 查询订单原始数据

       Order order = orderMapper.findById(id);

       if (Objects.isNull(order)) {

           return null;

       }


       // step 2 : 查询用户数据

       User user = queryUserInfoById(order.getUserId());


       // step 3 : 组装用户数据

       if (Objects.nonNull(user)) {

           order.setUser(user);

       }


       // step 4: 数据返回

       return order;

   }


   /**

 * 根据用户ID查找用户信息

 * @param userId    用户ID

 * @return          用户信息

 */

   private User queryUserInfoById(Long userId) {

       String url = "http://localhost:8081/user/" + userId;

       return restTemplate.getForObject(url, User.class);

   }

}

重启并访问order-service

RestTemplate如何实现远程服务调用

5.总结

本节笔者带领大家完成了SpringCloud工程从0->1的搭建,当然你不想搭建也可以直接采用方案一,二者等效,至此读者们完成了一个微服务工程的搭建、部署、访问。同时在本节最后一章,笔者基于RestTemplate发起的http请求实现远程调用,实现当A系统想要获取B系统数据时的跨系统数据交互。然而RESTful API(进一步了解可移步:链接)访问并不是微服务的唯一解决方案,如Dubbo的交互一样可以实现,希望读者们能不限于此。

在本章节,笔者希望大家对于微服务的拆分,服务调用关系有个初步认知,本例中当order-service调用user-service时,前者就充当了服务调用方,后者则是服务提供方,这种调用关系在后续我们将会大量使用。


思考问题

  • 如何实现服务远程调用?
  • 服务远程调用解决了什么问题?
  • 还有哪些技术可以实现远程服务调用?

6.推荐阅读资料

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
105 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
68 2
|
2月前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
4天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
82 12
Spring Cloud Alibaba:一站式微服务解决方案
|
11天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
45 5
|
23天前
|
监控 安全 持续交付
构建高效的微服务架构:从设计到部署
构建高效的微服务架构:从设计到部署
24 1
|
28天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
55 1
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
110 1
|
2月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?