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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 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.推荐阅读资料

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
|
1月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
103 17
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
77 1
|
2月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
185 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
2月前
|
Java 关系型数据库 Nacos
微服务SpringCloud链路追踪之Micrometer+Zipkin
SpringCloud+Openfeign远程调用,并用Mircrometer+Zipkin进行链路追踪
326 20
|
2月前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
463 13
Spring Cloud Alibaba:一站式微服务解决方案
|
2月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
303 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
210 5
|
3月前
|
监控 安全 持续交付
构建高效的微服务架构:从设计到部署
构建高效的微服务架构:从设计到部署
43 1