SpringBoot 搭建微服务初体验

时间:2023-02-27 13:08:38

(SpringBoot 搭建微服务初体验)

前言

大家好,微服务是现在面试中必不可少的一项技能了,掌握微服务,不仅能够加薪升职,还能在面试中,底气十足,不怯场,不怕被压薪资。所以今天就特意开了一个微服务专栏,给大家从0-1的介绍微服务知识,由浅入深,逐渐掌握,感兴趣的可以订阅收藏,防止下次找不到了哦~

Server端程序开发

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

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

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

SpringBoot 搭建微服务初体验 点击“Next”按钮,在新窗口关于项目描述的栏目中填入以下信息:

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

其他信息默认即可。

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

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

SpringBoot 搭建微服务初体验 导入以后,建议在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文件。

它们的位置如下: SpringBoot 搭建微服务初体验 本案例以电影数据为例,首先创建一张电影表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配置文件在项目中位置如图所示。

SpringBoot 搭建微服务初体验 添加以下内容,注意缩进格式:

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