1.父工程pom
<?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>cn.wang.demo</groupId>
<artifactId>SpringCloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--父工程坐标-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</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>Greenwich.SR1</spring-cloud.version>
<mysql.version>5.1.47</mysql.version>
</properties>
<!--依赖的版本管理-->
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- MyBatisPlus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--lombok插件坐标-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<!--maven插件坐标-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.user_server微服务(提供方)(库)
2.1pom
<?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">
<parent>
<artifactId>SpringCloud</artifactId>
<groupId>cn.wang.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user_server</artifactId>
<dependencies>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--Eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
2.2yml
server:
port: 8082
spring:
application:
name: user-server
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///springboot_db?useUnicode=true&characterEncoding=utf-8
username: root
password: 1234
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #指定注册中心的ip地址
3.入口类
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
//@EnableEurekaClient
//@EnableCircuitBreaker
//@SpringCloudApplication
@MapperScan("cn.wang.dao")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
4.Mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
}
5.pojo
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@TableName("tb_user")
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String userName; // 用户名
private String password; // 密码
private String name;// 姓名
private Integer age;// 年龄
private Integer sex;// 性别,1男性,2女性
private Date birthday;// 出生日期
private Date created;// 创建时间
private Date updated;// 更新时间
private String note;// 备注
}
6.service
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findById(Long id) {
return userMapper.selectById(id);
}
}
## 7.controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User findById(@PathVariable("id")Long id){
User user = userService.findById(id);
return user;
}
}
http://localhost:8082/user/1 验证方式
3.eureka_server注册中心
3.1pom
<?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">
<parent>
<artifactId>springcloud_demo2</artifactId>
<groupId>cn.wang.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka_server</artifactId>
<dependencies>
<!--Eureka的服务器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3.2yml
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #指定注册中心的ip地址
register-with-eureka: false //不注册自己
fetch-registry: false //不拉取服务
3.3入口类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer // 声明这是一个EurekaServer服务器
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class);
}
}
4.order_server微服务(调用方)(Feign)
4.1pom
<?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">
<parent>
<artifactId>springcloud_demo2</artifactId>
<groupId>cn.wang.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order_server</artifactId>
<dependencies>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Eureka的客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--打开Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
4.2yml
server:
port: 8080
spring:
application:
name: order-server
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #指定注册中心的ip地址
4.3入口类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient //开启Eureka客户端功能 和 @EnableDiscoveryClient 一样
@EnableFeignClients //开启Feign的功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
}
4.4pojo
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Long id;
private String userName; // 用户名
private String password; // 密码
private String name;// 姓名
private Integer age;// 年龄
private Integer sex;// 性别,1男性,2女性
private Date birthday;// 出生日期
private Date created;// 创建时间
private Date updated;// 更新时间
private String note;// 备注
}
4.5client-UserClient Feign接口
import cn.itcast.demo.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("user-server")//要调用的微服务应用名
public interface UserClient {
/**
* http://user-service/user/{id}
* 伪装的接口“入参”和“出参"和被调用方的服务要求一致
*/
//user-server/user/id
@GetMapping("/user/{id}")
User findById(@PathVariable("id")Long id);
}
4.6controller
@RestController
@RequestMapping("/order")
public class OrderController {
//注入Feign接口
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
public User findById(@PathVariable("id")Long id){
return userClient.findById(id);
}
}
http://localhost:8080/order/2 验证方式
5.zuul_server网关(路由规则)
5.1pom
<?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">
<parent>
<artifactId>springcloud_demo2</artifactId>
<groupId>cn.wang.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gateway_server</artifactId>
<dependencies>
<!--zuul的启动器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--eureka的客户端启动器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
5.2yml
server:
port: 10010
spring:
application:
name: gateway-server
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #指定注册中心的ip地址
zuul:
routes:
order-server: /order-server/** #这里写的路由规则也是默认规则
5.3入口类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class);
}
}
5.4自定义过滤器MyFilter继承ZuulFilter
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
@Component //将自定义过滤器放入spring容器
public class MyFilter extends ZuulFilter {
/**
* 过滤器类型:四种类型pre route post error
* @return
*/
@Override
public String filterType() {
//前置过滤器
return FilterConstants.PRE_TYPE;
}
/**
* 过滤器顺序
* @return
*/
@Override
public int filterOrder() {
//过滤器的顺序是从小到大 -1最小
return 0;
}
//过滤器是否开启过滤功能
@Override
public boolean shouldFilter() {
//如果为false代表过滤器没有用到
return true;
}
//过滤器的主逻辑
@Override
public Object run() throws ZuulException {
/**
* 过滤器逻辑
* 如果用户请求参数没有token,则403
*/
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
//从request的请求的参数中获取内容
String token = (String) request.getParameter("token");
if(StringUtils.isEmpty(token)){
ctx.setResponseStatusCode(403);
ctx.setSendZuulResponse(false);//禁止转发
}
return null;
}
}
http://localhost:10010/order-server/order/5?token=123 验证方式