SpringCloud
一.知识梳理
1.简介
SpringCloud官网:http://projects.spring.io/spring-cloud/
SpringCloud将流行的技术整合在一起,实现了:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:
Netflix公司
- Eureka:注册中心
- Zuul:服务网关
- Ribbon:负载均衡
- Feign:服务调用
- Hystix:熔断器
二.编写聚合工程来模拟微服务
聚合工程:一个父工程下多个子工程,其实跟创建多个项目工程是一样的。
项目:cloud-demo
1.添加依赖
父工程pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutu</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--pom.xml下添加这个使得子工程都依赖这个父工程的依赖-->
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<!--版本号管理-->
<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>Finchley.SR1</spring-cloud.version>
<mapper.starter.version>2.0.3</mapper.starter.version>
<mysql.version>5.1.32</mysql.version>
</properties>
<!--使用dependencyManagement可以给子工程继承-->
<dependencyManagement>
<dependencies>
<!--SpringCloud综合管理版本(SpringCloud的子功能都不需要自己操心版本了)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--通用Mapper启动器-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!--mysql驱动-->
<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>
</project>
2.创建Module子项目(服务的提供方)
1.创建Module名为user-service
2.给该子工程user-service添加依赖
<dependencies>
<!--Web工程所需要的web启动器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--通用mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
</dependencies>
3.配置application.yaml
在resource下创建一个application.yaml文件
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboottest?
username: root
password: 456456
mybatis:
type-aliases-package: com.tutu.user.pojo # 实体类包路径
4.编写启动类
创建UserApplication启动类
import tk.mybatis.spring.annotation.MapperScan;
//重点注意上面这个import是以tk开头而不是org开头否则会报 java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()错误。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.tutu.user.mapper") //通用mapper扫描包
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
5.编写实体类
@Data
@Table(name = "tb_user")
public class User {
@Id //设置主键注解
@KeySql(useGeneratedKeys = true) //告诉它user的主键id是自增的
private Long id;
private String userName;
private String password;
private String name;
private String age;
//性别 1男性 2女性
private Integer sex;
private Date birthday;
@Transient //瞬时的,代表这个属性不需要持久化到数据库,意思为表中没有这个属性的字段
private Date created;
}
6.配置通用mapper
import com.tutu.user.pojo.User;
import tk.mybatis.mapper.common.Mapper;
public interface UserMapper extends Mapper<User> {
}
//内容啥也不用写
7.编写USerService
@Service
public class UserService {
@Autowired
private UserMapper userMapper; //这里报红就点击左边红灯泡如下图(或者不用管)
public User queryById(Long id){
return userMapper.selectByPrimaryKey(id);
}
}
8.编写Controller
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}") //请求地址localhost:8081/user/5 5就是id
public User queryById(@PathVariable("id") Long id){ //接收参数
return userService.queryById(id);
}
}
9.注意
如果在IDEA的setting当中没有lombok的话,实体类User需要手动添加Set,Get,toString方法。
lombok在添加父工程依赖的时候已经引入过
3.创建Module子项目(服务的调用方)
1.继续创建Module
命名为consumer-demo
2.添加依赖
//添加到consumer-demo工程的pom.xml里面
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.编写启动类并注册远程调用
通过@Bean注解注册到Spring容器中
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate(); //远程调用
}
}
4.编写获取对应数据的实体类User
//与服务提供方user-service相比:这里不需要繁琐的配置,因为这里不需要用到数据库,只负责装载数据
public class User {
private Long id;
private String userName;
private String password;
private String name;
private String age;
//性别 1男性 2女性
private Integer sex;
private Date birthday;
private Date created;
//注意这个调用类必须要有set get toString方法(下面简写了,只需在这个类下右键Generate选择Getter and Setter 还有 toString即可自动生成)
get();
set();
toString()
}
5.最后再编写一个调用的Controller
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
String url = "http://localhost:8081/user/"+id;
User user = restTemplate.getForObject(url,User.class);
return user;
}
}
6.同时管理一个项目中的两个子项目
这样就可以同时管理两个子项目启动
7.测试结果
谷歌上输入:http://localhost:8080/consumer/3
继续学习请看下一篇