如何利用SpringBoot 搭建微服务?

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 这篇就利用SpringBoot 搭建微服务,带大家从代码的角度来加深对微服务的概念,理解了概念才会知道微服务怎么架构的,组件与组件之间是如何互通通信的

前言

Server端程序开发

这篇就利用SpringBoot 搭建微服务,带大家从代码的角度来加深对微服务的概念,理解了概念才会知道微服务怎么架构的,组件与组件之间是如何互通通信的,这些很重要,如有忘记的,大家可以去 微服务 专栏里再次查看。

1.创建Server项目,并添加依赖

首先新建一个Project,使用Spring Initializr来引入依赖,如图所示。

在这里插入图片描述

点击“Next”按钮,在新窗口关于项目描述的栏目中填入以下信息:

  • Group:输入项目的包名。
  • Aritifact:输入项目的名称。
  • Version:版本信息,默认0.0.1-SNAPSHOT。
  • JDK:选择1.8的即可

其他信息默认即可。

2.引入依赖,完善配置文件

填入项目信息之后,需要在项目中添加依赖,勾选Spring Web模块,如图所示:

在这里插入图片描述

导入以后,建议在pom.xml文件后面,添加aliyun的Maven仓库地址,可以更快地下载依赖:

全局配置:

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

单项目配置:

<repositories>
        <repository>
            <id>central</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <layout>default</layout>
            <!-- 是否开启发布版构件下载 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 是否开启快照版构件下载 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

因为案例需要访问数据库表,还需要引入spring-boot-starter-data- jpacom.h2database等依赖包,完整依赖部分的pom.xml代码如下所示:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>

3.开发SQL语句

classpath下添加两个文件:

  • schema.sql:是默认创建数据表的SQL文件。
  • data.sql:是默认初始化数据的SQL文件。

它们的位置如下:
在这里插入图片描述
本案例以电影数据为例,首先创建一张电影表movie,并插入几条影片数据。 在classpath:schema.sql中添加以下内容:

drop table movie if exists;
create table movie(
id bigint AUTO_INCREMENT,
author varchar(50)
);

classpsth:data.sql中添加以下初始化数据:

insert into movie values(1,'红高粱','张艺谋'); 
insert into movie values(2,'让子弹飞一会儿','姜文');

4.开发JavaBean

开发与数据库表movie对应的实体类Movie,代码如下:

 //导入的包略...
@Entity
@Table(name="movie")
public class Movie {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    @Column
    private String name;
    @Column
    private String author;

 //get/set方法略...
}

5.开发DAO接口

注意DAO接口是JpaRepository的子类,具体作用是访问数据库,代码如下:

//省略一些imports...
@Repository(value="movieRepository")
public interface MovieRepository extends JpaRepository<Movie, Lo }

JpaRepository接口包含CRUD等操作,来自于Spring Data JPA

Spring Data JPA是在实现了 JPA规范的基础上封装的一套JPA应用框架
使用 Spring DataJPA能够方便我们在不同的ORM框架之间进行切换,而不需要更改代码。Spring Data JPA旨在通过统一ORM框架的访问持久层的操作,来提高开发效率。Spring Data JPA提供了许多供开发者使用的接口,而JpaRepository是开发中最常使用的接口,主要继承了 PagingAndSortRepository,对返回值类型做了适配。

6.开发Service

业务层对应的MovieService代码如下:

 @Service(value = "movieService")
public class MovieService {

    /**
     * 使用@Autowaired 或者@Resource都可以
     */
    private MovieRespository movieRespository;

    public Movie findById(Long id) {
        //如果存在,则返回对象,否则返回null;
        return movieRespository.findById(id).orElse(null);
    }

}
    @GetMapping("/movie/{id}")
    public Movie findById(@PathVariable(name = "id") Long id) {
        return movieService.findById(id);
    }
}

注意: 需要将movieRepository注入到Service

7.开发Controller

最后开发控制层的Controller类,里面定义方法访问某个id对应的电影,代码如下:

@RestController
public class MovieController {
    @Resource(name = "movieService")
    private MovieService movieService;

    @GetMapping("/movie/{id}")
    public Movie findById(@PathVariable(name = "id") Long id) {
        return movieService.findById(id);
    }
}

8.修改配置文件

classpath目录下的application.propertiesapplication.yml都可以作为 Spring Boot的配置文件。其中application.yml语言的操作更方便,且在开发环境下,还可以提示帮助。yml配置文件在项目中位置如图所示。

在这里插入图片描述
添加以下内容,注意缩进格式:

server:
  port: 6789

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/text?useSSL=false&useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource


mybatis:
  mapper-locations: classpath:mapper/*.xml
  check-config-location: true
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

9.修改启动类

修改类SpringcloudMovieServerApplication,添加一些注解,代码如下:

@SpringBootApplication
@EntityScan
@EnableJpaRepositories
public class SpringcloudMovieServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringcloudMovieServerApplication.class, args);
    }
}
  • @EntityScan: 用来扫描和发现指定包及其子包中的Entity定义
  • @EnableJpaRepositories用来扫描和发现指定包及其子包中的Repository 定义。如果多处使用@EnableJpaRepositories,它们的basePackages集合不能有交集,并且要能覆盖所有需要的Repository定义。

10.启动并访问

SpringcloudMovieServerApplication类上右击,在弹出的快捷菜单中选择Run选项,

访问:

http://localhost:6789/movie/1
http://localhost:6789/movie/2

显示结果:

{"id":2,"name":"让子弹飞一会儿","author":"姜文"}

至此,Spring Boot程序已经开发完成了。

客户端开发

我们开发了服务端后,还需要一个客户端(也是基于springBoot)来访问服务端(这时候服务端就是类似于微服务的注册中心)。

流程和服务端开发类似。

1.创建项目

首先新建一个Project,使用Spring Initializr来引入依赖。

这里只需要Web模块即可,只涉及Server端的访问。

2.创建JavaBean

创建一个与Server端相同的JavaBean,只是不需要添加JPA的注解。

public class Movie {
    private Long id;
    private String name; 
    private String author; 
    }

3.创建Controller

客户端Controller代码是通过Restful方式对服务端进行调用的,此处 采用了RestTemplate类进行调用,具体代码如下:

@RestController
public class MovieClientController    {
    //添加 RestTemplate
    @Resource(name = "restTemplate")
    private RestTemplate restTemplate;
    @GetMapping("/movive/client/id")
    public  Movie findById(@PathVariable Long id){
        return restTemplate.getForObject("http:localhost:6789/movie/"+id,Movie.class);
    }
}

上面的URL是通过硬编码写到代码中的,当然URL也可以配置到 application.yml中,文件中添加如下内容:

#用户配置 movie:
  url: http://localhost:6789/movie/

4.修改yml文件

修改classpath:application.yml配置文件,因为这是一个Web应用,所以只需要配置端口即可,项目根目录下找到配置文件

 server:
     port:6799

5.修改启动类

在启动类中实现两个操作:

  • 添加@ComponentScan注解。
  • 使用@Bean声明RestTemplate的SpringBean

具体启动类代码如下:

@SpringBootApplication
@ComponentScan
public class SpringCloudMovieClientApplication {
    @Bean
    public RestTemplate restTemplate(){}
    return new RestTemplate();
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudMovieClientApplication.class, args);
    }
}

RestTemplate是Spring用于同步Client端的核心类,它简化了与HTTP 服务的通信,并满足Restful原则,程序代码可以给它提供URL,并提取结果。

6.启动两个项目访问

访问客户端地址:http://localhost:6799/movie/client/2。 注意访问的端口为6799。
返回:

{"id":2,"name":"让子弹飞一会儿","author":"姜文"}

至此,一个完整的Spring Boot程序就完成了。这里的客户端和服务端是两个不同的微服务,通过RestTemplate可以进行访问。

总结

通过前面学习的概念,再利用对SprinBoot掌握,可以搭建一个简单小型的微服务,体验一下微服务的流程,这里面主要涉及到注册中心。微服务与微服务之间是如何通信的,如何进行相互注册,以及如何进行熔断等等,会在后续中一一讲解,如果有感兴趣的小伙伴,想要了解和学习微服务这块的,可以订阅收藏哦,防止下次找不到了~

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
6月前
|
机器学习/深度学习 负载均衡 Java
【SpringBoot系列】微服务远程调用Open Feign深度学习
【4月更文挑战第9天】微服务远程调度open Feign 框架学习
317 2
|
6月前
|
Dubbo Java 应用服务中间件
微服务框架(十六)Spring Boot及Dubbo zipkin 链路追踪组件埋点
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文第一部分为调用链、OpenTracing、Zipkin和Jeager的简述;第二部分为Spring Boot及Dubbo zipkin 链路追踪组件埋点
|
6月前
|
Java Nacos Maven
从零搭建微服务架构:Spring Boot与Nacos完美整合
从零搭建微服务架构:Spring Boot与Nacos完美整合
1563 0
|
6月前
|
JSON Dubbo Java
微服务框架(二十)Dubbo Spring Boot 生产就绪特性
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Dubbo Spring Boot 生产就绪特性
|
6月前
|
Dubbo Java 应用服务中间件
微服务框架(十四)Spring Boot @ControllerAdvice异常处理
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Spring Boot使用@ControllerAdvice进行自定义异常捕捉
|
6月前
|
存储 Java 时序数据库
【SpringBoot系列】微服务监测(常用指标及自定义指标)
【4月更文挑战第6天】SpringBoot微服务的监测指标及自定义指标讲解
195 0
|
2月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
74 2
|
5月前
|
监控 数据管理 Java
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
智慧城管执法系统利用微服务和Java技术提升城市管理水平,涵盖事件处理、投诉、处罚等功能,包含PC和APP源码。系统支持执法APP,便于领导随时随地审批,具备文书模板、地图定位、法规查询等功能。此外,执法办案系统通过监控视频分析事件,实现案件全程闭环管理,包括组织、案件、信用和执法队伍管理,以及法规库等基础支撑。系统旨在优化流程,提高数据管理和效率。
135 3
智慧城管源码,基于微服务+java+springboot+vue+uniapp开发的城管综合执法系统源码
|
4月前
|
消息中间件 负载均衡 Java
最容易学会的springboot gralde spring cloud 多模块微服务项目
最容易学会的springboot gralde spring cloud 多模块微服务项目