Springcloud实战:开发课程查询功能(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Springcloud实战:开发课程查询功能(一)

项目模块预览



一般我们做项目使用的springboot,但是一旦项目做的大了之后,服务功能越做越多就会导致代码冗余,可能一个服务中提供了多项功能,可能导致越到后面就会出现单个工程项目越来越大,代码冗余的情况;并且集群部署时,可能一个服务提供了多项功能导致大量的请求来临到某个服务。


基于种种原因出现了微服务,微服务指的是将原本的大的服务模块进行拆分,例如订单模块、日志模块、基础数据模块等等等,每一个模块都是服务,服务与服务之间也能够进行相互调用,下面我介绍一下springcloud中每个组件的功能及出现的目的:


最原始阶段:后台管理服务、前台服务、小程序服务,后台管理提供给用户后台管理的功能,前台负责数据展示的功能,小程序提供一些小程序需要的功能
  问题:后台管理服务到之后也会涉及很多的功能模块,若是不进行拆分,后台管理做的很大时就会不利于代码扩展与编写等等导致冗余等情况,其他部分也是如此
springcloud搭建微服务
——————1、搭建一个服务中心服务
首先微服务需要有一个服务中心(Eureka Server),对应的服务在启动时都能够进行注册到服务中心上去。
  服务中心为之后远程调用、网关统一鉴权都提供了很大的便利
————————2、改造基本服务为eureka client
有了服务中心,接着我们需要将我们的服务注册到服务中心上去,如何注册呢?就需要将我们的原本服务改造为Eureka client并进行配置服务中心地址,当服务启动时就会自动注册到服务中心。
————3、引入openfeign,让服务具有远程调用的功能
注册好以后,其实我们某个服务可能需要去调用其他远程服务的接口,此时急需要在eureka client中引入openfeign,编写feign client接口来进行远程调用。
————4、解决远程可能会出现的问题,引入Hystrix
能够远程调用了,此时就会出现问题,因为远程调用难免会出现一系列的问题如调用的服务瘫痪,功能不可用情况,如何解决呢?springcloud也给我们提供了一个组件断路器Hystrix,其能够在我们调用远程服务出现不可避免的问题时返回默认内容,根据我们需求自己定义。
————5、实现鉴权等功能,引入Zuul
此时我们的服务中心已经初步具备管理多个节点功能,此时我们又出现了一个需求就是对应的服务也不能够被人随意访问,那么就需要对我们的服务提供保护措施,此时需要有一个统一的鉴权服务,Zuul出现了,我们想要访问某个服务中得接口可以统一通过zuul网关来进行访问,在zuul中我们可以通过设置过滤器来实现一些特定的功能。
————6、负载均衡,Ribbon
在3中引入openfeign具有调用远程服务接口的能力,一般的话远程服务不会独有一份,可能有多个相同节点服务,如何解决大量请求会去调用远程服务时的选择策略,springcloud提供了一个Ribbon组件,其包含三个策略用于我们进行远程调用服务的选择等等


总而言之:要想把大的服务模块进行拆分,拆分为多个微服务并且服务与服务之前进行相互调用就会面临一系列的问题,springcloud组织给出了一系列的解决方案,每个组件都有其存在的意义,都能够解决相对应的痛点。



完整项目


本次项目:主要就是两个服务,一个服务提供课程列表的功能,另一个服务提供课程价格的功能,通过这两个简单服务来整合springcloud,进行学习springcloud中的六个组件。


数据库



一个是课程表、另一个是课程价格表,前者与后者是一对多的关系。


/*
 Navicat Premium Data Transfer
 Source Server         : 本地mysql5.7
 Source Server Type    : MySQL
 Source Server Version : 50732
 Source Host           : localhost:3306
 Source Schema         : test
 Target Server Type    : MySQL
 Target Server Version : 50732
 File Encoding         : 65001
 Date: 05/10/2021 10:51:03
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `id` int(11) NOT NULL,
  `course_id` int(11) NULL DEFAULT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `valid` int(1) NULL DEFAULT NULL COMMENT '是否上架,0不上架,1上架\r\n',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 362, 'Java并发核心知识体系靖江', 1);
INSERT INTO `course` VALUES (2, 409, '玩转Java并发工具,精通JUC', 1);
INSERT INTO `course` VALUES (3, 121, 'Nginx入门到实践', 0);
-- ----------------------------
-- Table structure for course_price
-- ----------------------------
DROP TABLE IF EXISTS `course_price`;
CREATE TABLE `course_price`  (
  `id` int(11) NOT NULL,
  `course_id` int(11) NULL DEFAULT NULL,
  `price` decimal(10, 2) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of course_price
-- ----------------------------
INSERT INTO `course_price` VALUES (1, 362, 348.50);
INSERT INTO `course_price` VALUES (2, 409, 399.68);
INSERT INTO `course_price` VALUES (3, 121, 266.78);
SET FOREIGN_KEY_CHECKS = 1;


spring-cloud-course-practice(总模块)



pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--  模块化管理  -->
    <packaging>pom</packaging>
    <modules>
        <module>course-service</module>
        <module>eurake-server</module>
        <module>course-zuul</module>
    </modules>
    <!-- 父模块   -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.changlu</groupId>
    <artifactId>spring-cloud-course-practice</artifactId>
    <version>1.0.0</version>
    <name>spring-cloud-course-practice</name>
    <description>course project for Spring Cloud</description>
    <properties>
        <java.version>1.8</java.version>
        <mybatis.plus.version>3.4.3</mybatis.plus.version>
        <mysql-version>8.0.23</mysql-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--  表示Spring Cloud的版本-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>
            <!--       SpringCloud指定版本     -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>》


eurake-server(服务中心服务)



pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-course-practice</artifactId>
        <groupId>com.changlu</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>eurake-server</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <!-- 模块名及描述信息 -->
    <name>course-eureka-server</name>
    <description>Spring Cloud Eureka</description>
    <dependencies>
        <!-- 服务中心依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>



EurekaServerApplication.java:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
 * @ClassName EurakeServerApplication
 * @Author ChangLu
 * @Date 2021/10/4 13:42
 * @Description 服务中心服务
 */
@EnableEurekaServer   //开启Eureka Server服务
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}


application.yaml:


server:
  port: 8000
spring:
  application:
    name: eureka-server  # 应用名称
eureka:
  instance:
    hostname: localhost  
  client:
    fetch-registry: false  #fetch-registry:获取注册表。不需要同步其他节点数据。(当前没有建立eureka server集群,这里不需要同步节点)
    register-with-eureka: false  # 代表是否将自己也注册到Eureka Server,这里不注册
    service-url:  # 设置服务中心的地址  => http://localhost:8000/eureka/
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/


此时我们访问服务中心:http://localhost:8000/



course-service(课程模块)



pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-course-practice</artifactId>
        <groupId>com.changlu</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <groupId>com.changlu</groupId>
    <artifactId>course-service</artifactId>
    <!-- 管理两个服务 -->
    <modules>
        <module>course-list</module>
        <module>course-price</module>
    </modules>
</project>



course-list(课程服务)



pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.changlu</groupId>
        <artifactId>course-service</artifactId>
        <version>1.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.changlu</groupId>
    <artifactId>course-list</artifactId>
    <version>1.0.0</version>
    <name>course-list</name>
    <description>course list</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>
        <!--    Eureka-client:用于注册到服务中心    -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>



application.yaml:


spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  application:
    name: course-list   # 应用名
server:
  port: 8080
# 指定注册的服务中心地址,一般与eureka-server中配置的对应,此时该服务启动就会将自己注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/
# 被course-price调用并设置ribbon,所以这里要开启
ribbon:
  eureka:
    enabled: true



启动器:


import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.changlu.democourse.mapper")
public class CourseListApplication {
    public static void main(String[] args) {
        SpringApplication.run(CourseListApplication.class, args);
    }
}



controller、service、mapper一系列



@Data
public class Course implements Serializable {
    private static final long serialVersionUID = -6849794470748667710L;
    private Integer id;
    private Integer courseId;
    private String name;
    private Integer valid;
}
/**
 * @ClassName CourseController
 * @Author ChangLu
 * @Date 2021/10/4 13:03
 * @Description 课程控制器
 */
@RestController
@RequestMapping("/course")
public class CourseController {
    @Autowired
    private CourseService courseService;
    @GetMapping("/list")
    public List<Course> getList(){
        return  courseService.getCourseList();
    }
}
public interface CourseService {
    List<Course> getCourseList();
}
@Service
public class CourseServiceImpl implements CourseService {
    @Autowired
    private CourseMapper courseMapper;
    @Override
    public List<Course> getCourseList() {
        return courseMapper.getCourseList();
    }
}
@Repository
public interface CourseMapper {
    @Select("select * from course")
    List<Course> getCourseList();
}


该服务提供了查询课程的能力,该服务启动时将会被注册到服务中心。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
62 5
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
60 3
|
2月前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
226 6
|
2月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
125 2
|
2月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
34 1
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
79 0
|
2月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
59 0
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
54 0
|
3月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
269 6
|
4月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
195 0
下一篇
DataWorks