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