项目结构如下:
SpringCloud-demo是父项目
SpringCloud-consumer是消费者模块(前端控制器),同时整合了openfeign
SpringCloud-gateway就是网关了
SpringCloud-provider是生产者模块(提供DB的API)
?

?nacos
下载并安装nacos,单机启动bin/startup.cmd即可
http://ip:8848/nacos
账号、密码都是nacos
创建SpringCloud-demo父项目过程略
创建SpringCloud-provider
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.fan</groupId>
<artifactId>SpringCloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>SpringCloud-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloud-provider</name>
<description>SpringCloud-provider</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- mybatis 与 spring boot 2.x的整合包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql JDBC驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- <version>5.1.39</version> -->
<!--引入druid-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.58.Final</version>
</dependency>
<!--xxl-job结束 -->
<!--fastjson-->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.14</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8008
spring:
application:
name: provider-server #服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos的服务注册中心地址
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password:
controller
/**
* @ClassName -> UserController
* @Description openFeign调这里的API
* @Author fan
* @Date 2022/10/14 16:33 星期五
* @Version 1.0
*/
@RestController
@Slf4j
public class UserController {
@Autowired
UserService userService;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@GetMapping(value = "/getListById")
public List<User> getListById(@RequestParam("id") Integer id) {
log.info("当前时间-->" + sdf.format(new Date()));
List<User> users = userService.selectUserById(id);
log.info("[查询结果] users={}" , users);
return users;
}
}
service略
创建SpringCloud-consumer--前端请求的入口
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.fan</groupId>
<artifactId>SpringCloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>SpringCloud-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloud-consumer</name>
<description>SpringCloud-consumer</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<!-- 集成sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<exclusions> <!--除去该依赖,controller返回的结果才是json,不去除就xml-->
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8009
spring:
application:
name: consumer-server #服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos的服务注册中心地址
#开启熔断开关
feign:
sentinel:
enabled: true
openFeign
/**
* @ClassName -> ConsumerOpenFeign
* @Description name :是yml 文件中的sprping.application.name ,
* FeignServiceFallBack 降级 当服务宕机时返回给页面的异常处理
* @Author fan
* @Date 2022/10/14 17:16 星期五
* @Version 1.0
*/
@FeignClient(name = "provider-server",fallbackFactory = FeignFallBackService.class)
public interface ConsumerOpenFeignService {
@GetMapping(value = "/getListById")
List<User> getListById(@RequestParam("id") Integer id);
}
实现类
@Component
@Slf4j
public class FeignFallBackService implements FallbackFactory<ConsumerOpenFeignService> {
@Override
public ConsumerOpenFeignService create(Throwable throwable) {
return new ConsumerOpenFeignService() {
@Override
public String index() {
return "生产者SpringCloud-provider服务被降级停用了";
}
@Override
public List<User> getListById(Integer id) {
return null;
}
};
}
}
controller如下
/**
* @ClassName -> UserWebController
* @Description 前端入口在此
* @Author fan
* @Date 2022/10/14 16:38 星期五
* @Version 1.0
*/
@RestController
@RequestMapping("/user")
@Slf4j
public class UserWebController {
@Autowired
private ConsumerOpenFeignService consumerFeign;
@GetMapping("/getListById")
public List<User> getListById2(Integer id){
log.info("Consumer_openFeign: id=" + id);
List<User> userList = consumerFeign.getListById(id);
return userList;
}
}
?启动类加上
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
创建SpringCloud-gateway
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>SpringCloud-gateway</artifactId>
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
application.yml
server:
port: 8010
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
- id: provider-route # 当前路由的标识, 要求唯一,可以随便写
uri: lb://provider-server # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
predicates: # 断言(就是路由转发要满足的条件)
- Path=/provider/** # 当请求路径满足Path指定的规则时,才进行路由转发
filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
- StripPrefix=1 # 转发之前去掉1层路径
- id: consumer-route
uri: lb://consumer-server
predicates:
- Path=/consumer/**
filters:
- StripPrefix=1
启动类就不贴了
自此简单的微服务就搭建完成了
分别启动provider,consumer,gateway
刷新

?测试结果

?前端请求到前端控制器调openFeign接口,openFeign接口调用provider,provider提供后台DB的API
|