SpringCloud初体验
这篇文章对微服务的初步了解有一点点帮助。如下图:
要实现微服务project1和微服务2之间调用服务和提供服务的通信。这里有一个父工程,是用来进行版本控制的。因为springboot和springcloud的版本有一定的对应关系,如果有很多个微服务,可能会有版本冲突的问题,所以采用父工程集中管理的方案。
下面的实验,会进行这样的模拟:
project2需要project1提供根据id获得用户信息的服务,project1则字project2 调用时提供响应的服务。
说白了就是两个微服务间的简单互动,来吧!开始吧!
创建父工程
- 创建maven工程
- 在pom.xml中导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建子工程
提供服务的project1
这个部分主要是做springboot整合jpa,实现从数据库中获取用户信息的功能。
-
创建project1工程
project1就是我们之前常写的,dao-service-controller老一套。
(这里创建完毕以后到父工程的pom文件可以看到以下代码)
<modules>
<module>project1</module>
</modules>
- 添加依赖(注意是新建的这个子工程的pom文件)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JPA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
这里的jpa类似于mybatis持久层框架,下面会对它进行介绍,以及简单使用。
- 在数据库中创建表,并连接数据库
老演员了…
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(2) NOT NULL,
`name` varchar(5) NOT NULL,
`age` int(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小红', '5');
INSERT INTO `user` VALUES ('2', '小蓝', '12');
INSERT INTO `user` VALUES ('3', '小绿', '99');
在resource文件夹下application.yml文件中进行端口号数据库配置
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
#test数据库名
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
- 项目目录如下,千篇一律的dao-service-controller
- User类:
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
//以下省略getter、setter
}
@Table(name = "user")
是让数据库表和创建的这个实体类进行User,name属性和数据库表名要一样。
@Id
标识主键
@GeneratedValue(strategy = GenerationType.IDENTITY)
标识主键的自增方式,IDENTITY说明是自动自增1
- UserDao接口
public interface UserDao extends JpaRepository<User,Integer> {
}
这里extends JpaRepository<User,Integer>
,JpaReposity包含了对数据库的一般操作,User是实体类,Integer是主键数据类型。
- UserService接口
public interface UserService {
//根据id返回用户信息
User findByUserId(Integer id);
}
findByUserId
是jpa自己有的,敲代码会有提示
- UserService实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public User findByUserId(Integer id) {
return userDao.findById(id).get();
}
}
注意到这里和MyBatis有些不一样,userDao.findById(id).get()
,这里有个.get() !!不要忘了
- UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/find/{id}")
public User findById(@PathVariable Integer id){
return userService.findByUserId(id);
}
}
- Project1Application启动类
@SpringBootApplication
public class Project1Application {
public static void main(String[] args) {
SpringApplication.run(Project1Application.class,args);
}
}
- 运行启动类,浏览器访问:http://localhost:8080/user/find/1 ,得到以下结果,说明结果说明project1提供服务的功能没问题了。接下里就是project2!
需要服务的project2
project2需要调用project1根据id查询用户信息的这一个服务。话不多说!开干!
- 创建工程
和project1一样,选中parent-project,新建model
整个项目结构是这样的:
- 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
-
目录
-
实体类User
public class User {
private Integer id;
private String name;
private Integer age;
//以下省略getterr、setter
}
- resource文件夹下新建application.yml文件,设置下端口号。
因为是微服务,所以project1,project2是运行在不同服务器上的,所以端口号会不一样。
server:
port: 8081
- 启动类Project2Application,这里解释下下面这段代码。
@SpringBootApplication
public class Project2Application {
public static void main(String[] args) {
SpringApplication.run(Project2Application.class,args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
关于RestTemplate:用Restful风格进行过开发的更容易理解,没用过的话就项先简单理解为一个模拟发起请求的东东,继续往下看就知道了。这里先注册一下,让spring进行管理。
- UserController
@RestController
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
public User queryById(@PathVariable Integer id){
String url = "http://localhost:8080/user/find/"+id;
return restTemplate.getForObject(url,User.class);
}
}
project2是要调用project1的服务,所以这个controller是用来发起请求的。
从下面的代码来体会下RestTemplate的用法。
在启动类的时候注册了RestTemplate,在这里就可以自动注入了。代码中的url变量是project1的访问地址。
getForObject(url,User.class)
,会获取到project1服务器给出的User信息,并自动转成user对象返回。行不行看结果,下一步!
- 运行启动类!浏览器访问:http://localhost:8081/2 ,结果如下!成功啦!