SpringBoot 搭建微服务初体验
前言
大家好,我是DJ李淳罡,微服务是现在面试中必不可少的一项技能了,掌握微服务,不仅能够加薪升职,还能在面试中,底气十足,不怯场,不怕被压薪资。所以今天就特意开了一个微服务专栏,给大家从0-1的介绍微服务知识,由浅入深,逐渐掌握,感兴趣的可以订阅收藏,防止下次找不到了哦~
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- jpa
、
com.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
中添加以下内容:
droptable movie ifexists;createtable movie(
id bigintAUTO_INCREMENT,
author varchar(50));
在
classpsth:data.sql
中添加以下初始化数据:
insertinto movie values(1,'红高粱','张艺谋');insertinto movie values(2,'让子弹飞一会儿','姜文');
4.开发JavaBean
开发与数据库表
movie
对应的实体类
Movie
,代码如下:
//导入的包略...@Entity@Table(name="movie")publicclassMovie{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLong id;@ColumnprivateString name;@ColumnprivateString author;//get/set方法略...}
5.开发DAO接口
注意DAO接口是
JpaRepository
的子类,具体作用是访问数据库,代码如下:
//省略一些imports...@Repository(value="movieRepository")publicinterfaceMovieRepositoryextendsJpaRepository<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")publicclassMovieService{/**
* 使用@Autowaired 或者@Resource都可以
*/privateMovieRespository movieRespository;publicMoviefindById(Long id){//如果存在,则返回对象,否则返回null;return movieRespository.findById(id).orElse(null);}}@GetMapping("/movie/{id}")publicMoviefindById(@PathVariable(name ="id")Long id){return movieService.findById(id);}}
注意: 需要将
movieRepository
注入到
Service
。
7.开发Controller
最后开发控制层的
Controller
类,里面定义方法访问某个id对应的电影,代码如下:
@RestControllerpublicclassMovieController{@Resource(name ="movieService")privateMovieService movieService;@GetMapping("/movie/{id}")publicMoviefindById(@PathVariable(name ="id")Long id){return movieService.findById(id);}}
8.修改配置文件
classpath
目录下的
application.properties
或
application.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@EnableJpaRepositoriespublicclassSpringcloudMovieServerApplication{publicstaticvoidmain(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的注解。
publicclassMovie{privateLong id;privateString name;privateString author;}
3.创建Controller
客户端Controller代码是通过
Restful
方式对服务端进行调用的,此处 采用了
RestTemplate
类进行调用,具体代码如下:
@RestControllerpublicclassMovieClientController{//添加 RestTemplate@Resource(name ="restTemplate")privateRestTemplate restTemplate;@GetMapping("/movive/client/id")publicMoviefindById(@PathVariableLong 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@ComponentScanpublicclassSpringCloudMovieClientApplication{@BeanpublicRestTemplaterestTemplate(){}returnnewRestTemplate();publicstaticvoidmain(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掌握,可以搭建一个简单小型的微服务,体验一下微服务的流程,这里面主要涉及到
注册中心
。微服务与微服务之间是如何通信的,如何进行相互注册,以及如何进行熔断等等,会在后续中一一讲解,如果有感兴趣的小伙伴,想要了解和学习微服务这块的,可以订阅收藏哦,防止下次找不到了~
版权归原作者 _李淳罡 所有, 如有侵权,请联系我们删除。