SpringCloud 是Sping旗下的项目之一,官网:http://projects.spring.io/spring-cloud/
把非常流行的技术整合在一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能,主要涉及组件:
- Eureka:注册中心
- Zuul:服务网关
- Ribbon:负载均衡
- Feign:服务调用
- Hystrix:熔断器
准备工作:
-- 创建mysql库
create database `test-basedata` default character set utf8mb4 collate utf8mb4_general_ci;
-- 创建数据表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id' ,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`key_word` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关键词',
`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别 {男:1,女:2}',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`birthday` date NULL DEFAULT NULL COMMENT '生日',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',
`create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT='测试用户表' AUTO_INCREMENT=1 ROW_FORMAT = Dynamic;
-- 插入数据
INSERT INTO `sys_user` VALUES (1, '校花', NULL, '2', 18, NULL, NULL, NULL, 'admin', '2019-04-10 11:42:57', NULL, NULL);
服务调用
- 创建聚合工程
File -> new Project->选择maven工程
groupId:com.sharpnew.demo sharpneqw(开发组,公司名)+项目名称
artifactId:cloud-demo 项目的唯一标识
父工程引入依赖:
properties: 管理包的属性,可以减少修改
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<!--设定一个空值将始终从仓库中获取,不从本地路径获取-->
<relativePath/>
</parent>
<modules>
<module>user-service</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
<mapper.starter.version>2.0.3</mapper.starter.version>
<mysql.version>5.1.47</mysql.version>
</properties>
<!--子工程不继承,如果引用要声明不指定版本,可以使用父工程的版本-->
<dependencyManagement>
<dependencies>
<!--spring-Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--版本管理-->
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<!--scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布-->
<scope>import</scope>
</dependency>
<!--通用的Mapper启动器-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.1. 模拟服务提供 - 调用
-
建立子工程 (user-service)
目录要建立在父工程里面 -
配置 application.yml
server:
port: 8101
spring:
datasource:
url: jdbc:mysql://localhost:3306/test-basedata
username: root
password: XXXX
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: com.sharpnew.user.pojo
3.配置启动类 com.sharpnew.UserApplication
@SpringBootApplication
@MapperScan("com.sharpnew.user.mapper")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
- 建立实体类 com.sharpnew.user.pojo
@Table(name = "sys_user")
@Data
public class User {
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
private String name;//姓名
private String keyWord;//关键字
private Integer sex;//性别
private Integer age;//年龄
private Date birthday;//生日
private String email;//邮箱
private String content;//内容
private String createBy;//创建人
private Date createTime;//创建时间
private String updateBy;//修改人
private Date updateTime;//修改时间
}
- 建立 mapper类 com.sharpnew.user.mapper
public interface UserMapper extends Mapper<User> {
}
- 建立服务类 com.sharpnew.user.service.UserService
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return userMapper.selectByPrimaryKey(id);
}
}
- 建立controller类 com.sharpnew.user.controller.UserController
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
浏览器打开地址:http://localhost:8101/user/1 即可看到结果
调用:
- 启动类
@SpringBootApplication
public class ConsumerApplication {
//将对象交给spring 管理
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
2.controller类
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id) {
String url = String.format("http://localhost:8101/user/%s", id);
System.out.println(url);
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
存在问题:
在consumer中,我们把url写死在代码中,不方便维护
cunsumer需要记忆user-service的地址,如果出现变更,得不到通知,地址会失效
consumer不清楚user-service的状态,服务宕机也不知道
user-service 只有一个服务,不具备高可用性
即使user-service形成集群,consumer还需要自己实现负载均衡
综上所述,引入springCloud,主要解决以下问题:
服务管理
如何自动注册和发现
如何实现状态监管
如何实现动态路由
服务如何实现负载均衡
服务如何解决容灾问题
服务如何实现统一配置