1、建立父工程
首先创建一个父工程,名字为spring cloud打开IDEA(以下编码过程编码工具采用IDEA)。
创建新工程为Spring Cloud。
选择下一步
引入pom.xml代码如下:
4.0.0
cn.org.july.springcloud
springcloud
1.0-SNAPSHOT
pom
1.0-SNAPSHOT
UTF-8
UTF-8
1.8
1.16.18
1.2.17
4.12
6.0.6
1.1.10
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR2
pom
import
org.springframework.boot
spring-boot-dependencies
2.0.6.RELEASE
pom
import
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
ch.qos.logback
logback-core
1.2.3
junit
junit
${junit.version}
test
log4j
log4j
${log4j.version}
org.apache.maven.plugins
maven-jar-plugin
maven-site-plugin
2.3
default-site
site
site
org.apache.maven.plugins
maven-deploy-plugin
2.8.2
true
该工程为父工程,打包方式为pom.
2、建立服务API模块
在父工程中,新建Module
,module名称为springcloud-api
创建完成后项目结构如下:
新建包cn.org.july.springcloud.api.entities
新建类User
内容如下:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User implements Serializable {
/**
* 主键
*/
private Integer id;
/**
* 部门名称
*/
private String userName;
/**
* 存储数据库位置(分布式部署可能存在多个数据库)
*/
private String dbSource;
/**
* 电话号
*/
private Spring phone;
/**
* 邮箱
*/
private String email;
/**
* 密码
*/
private String pwd;
}
说明:此次使用lombok插件;官网 https://www.projectlombok.org/
注解 | 说明 |
---|---|
@Data | 在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含getter、setter、NoArgsConstructor注解,即当使用当前注解时,会自动生成包含的所有方法; |
@getter | 在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法; |
@setter | 在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法; |
@NoArgsConstructor | 在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法; |
@AllArgsConstructor | 在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法; |
@ToString | 在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法; |
@EqualsAndHashCode | 在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法; |
@Slf4j | 在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可; |
@Log4j | 在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可; |
@Accessors(prefix = {"first"}, fluent = true, chain = false) | 与生存的get和set方法有关,prefix与定义属性前缀相同时且接下来的字符大写才生效,可以看源码注释或自行尝试; fluent是决定生成的get/set方法要不要set/get前缀,chain决定set方法是void类型还是返回this |
项目POM文件内容如下:
4.0.0
cn.org.july.springcloud
springcloud
1.0-SNAPSHOT
springcloud-api
org.projectlombok
lombok
1.16.18
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class User implements Serializable {
/**
* 主键
*/
private Integer id;
/**
* 部门名称
*/
private String userName;
/**
* 存储数据库位置(分布式部署可能存在多个数据库)
*/
private String dbSource;
/**
* 电话号
*/
private Spring phone;
/**
* 邮箱
*/
private String email;
/**
* 密码
*/
private String pwd;
}
3、建立服务提供者
在父工程中,新建Module
,module名称为springcloud-provider-user-8001
。
创建过程如上,不再截图。
修改该Module
pom.xml文件,内容如下:
springcloud
cn.org.july.springcloud
1.0-SNAPSHOT
4.0.0
springcloud-provider-user-8001
cn.org.july.springcloud
springcloud-api
${project.version}
junit
junit
com.alibaba
druid
mysql
mysql-connector-java
ch.qos.logback
logback-core
org.mybatis.spring.boot
mybatis-spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
我们这里主要是讲整体架构搭建,我们不具体实现复杂的业务逻辑。以下只实现查询接口。
在新建的Module中建立如下项目结构:
新建包路径
cn.org.july.springcloud.dao;cn.org.july.springcloud.service;cn.org.july.springcloud.controller;
。-
在
resources
目录下创建application.yml
配置文件。xserver: port: 8001 mybatis: type-aliases-package: cn.org.july.springcloudapi.entities #所以entity别名类所在路径 spring: application: name: springcloud-user datasource: type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型 driver-class-name: com.mysql.cj.jdbc.Driver #mysql驱动包 url: jdbc:mysql://127.0.0.1:3306/cloudDB01 #数据库连接 username: root password: xxxx dbcp2: min-idle: 5 #数据库连接池的最小维持连接数 initial-size: 5 #初始化连接数 max-total: 5 #最大连接数 max-wait-millis: 200 #等待连接获取的最大超时时间
注意:
spring: application: name: springcloud-user
-
新建数据库cloudDB01执行以下脚本
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50719 Source Host : localhost Source Database : cloudDB01 Target Server Type : MySQL Target Server Version : 50719 File Encoding : utf-8 Date: 11/18/2018 14:19:42 PM */ SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `dbSource` varchar(50) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `pwd` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of `user_copy` -- ---------------------------- BEGIN; INSERT INTO `user` VALUES ('1', 'JULY', 'cloudDB01', '18232533234', '[email protected]', '123456'), ('2', 'WHJ', 'cloudDB01', '12312312312', '[email protected]', '123456'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
-
在dao中新建类:
UserDao
.内容如下:@Mapper public interface UserDao { @Select("select * from user") List
findAll(); @Select("select * from user where id = #{id}") User findById(Long id); } -
在service中新建类:
UserService
。内容如下:@Service public class UserService { @Autowired private UserDao userDao; public User findById(Long id) { return userDao.findById(id); } public List
findAll() { return userDao.findAll(); } } -
在controller中新建类:
UserController
。内容如下:@RestController @RequestMapping public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/user/all") @ResponseBody public List
getAllUser(){ return userService.findAll(); } @RequestMapping(value = "/user/{id}") @ResponseBody public User getUserById(@PathVariable("id") Long id){ return userService.findById(id); } } -
创建服务启动类
Application_provider_8001
。内容如下:@SpringBootApplication @MapperScan(basePackages = "cn.org.july.springcloud") public class Application_provider_8001 { public static void main(String[] args) { SpringApplication.run(Application_provider_8001.class, args); } }
启动后在浏览器中输入http://localhost:8001/user/all;返回内容如下,说明服务提供者搭建成功。
4、创建服务消费者
新建Module
,名称为springcloud-consumer-user-8000
。
创建过来不在详细讲述;创建完成后,项目结构目录如下:
[图片上传失败...(image-f5e239-1546251342956)]
在
springcloud-consumer-user-8000
中,新建包结构,cn.org.july.springcloud.cfgbean;cn.org.july.springcloud.controller
.-
在
resources
目录新建application.yml
配置文件server: port: 8000
作为服务消费者,只需要指定服务端口即可。
-
在
cn.org.july.springcloud.cfgbean
包创建ConfigBean
.内容如下:@Configuration public class ConfigBean { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
关于这两个注解,笔者在Spring Boot 中已经详细讲解过,有想了解,提供传送门;https://blog.csdn.net/July_whj/article/details/83449911
RestTemplate: RestTemplate 提供了多种便捷访问远程HTTP服务的方法,是一种简单便捷的访问restful服务模版类,是Spring提供的用于访问Rest服务的客户端模版工具集。详情查看官方网站 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
-
在
controller
中新建UserController_Consumer
类。(这里命名有点怪。。。)@RestController public class UserController_Consumer { /** * 服务提供方地址 */ private static final String url = "http://localhost:8001/"; /** * RestTemplate 提供了多种便捷访问远程HTTP服务的方法 * 是一种简单便捷的访问restful服务模版类,是Spring提供的用于访问 * Rest服务的客户端模版工具集 */ @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/consumer/user/all") @ResponseBody public List getUserAll() { return restTemplate.getForObject(url.concat("user/all"), List.class); } @RequestMapping(value = "/consumer/user/{id}") @ResponseBody public ResponseEntity
getUserById(@PathVariable("id") Long id) { return restTemplate.getForEntity(url.concat("user/").concat(id.toString()), User.class); } } 这里和服务提供者的区别访问地址新增
consumer
路径。 -
创建服务启动类
Application_consumer_8000
,内容如下:@SpringBootApplication public class Application_consumer_8000 { public static void main(String[] args) { SpringApplication.run(Application_consumer_8000.class, args); } }
首先启动服务提供者服务
springcloud-provider-user-8001
,在启动服务消费者springcloud-consumer-user-8000
.服务启动成功后访问 http://localhost:8000/consumer/user/1;http://localhost:8000/consumer/user/all
出现以上结果,服务消费者配置成功。该程序只做简单实例。