1.项目目录结构
2.创建项目名称为springcloud-001
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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.xiao</groupId>
<artifactId>springcloud-001</artifactId>
<version>1.0</version>
<!-- 父级项目中,此处配置为pom -->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<spring-boot-version>2.3.2.RELEASE</spring-boot-version>
<spring-cloud-version>2.2.6.RELEASE</spring-cloud-version>
<spring-cloud-dependencies>2.2.6.RELEASE</spring-cloud-dependencies>
<spring-cloud-nacos-version>2.2.6.RELEASE</spring-cloud-nacos-version>
<spring-cloud-openfeign-version>2.2.6.RELEASE</spring-cloud-openfeign-version>
<spring-cloud-gateway-version>2.2.6.RELEASE</spring-cloud-gateway-version>
<ali-csp-version>1.8.1</ali-csp-version>
</properties>
<!-- 这里放子模块 -->
<modules>
<module>springcloud-provider</module>
<module>springcloud-consumer</module>
<module>springcloud-gateway</module>
<module>springcloud-api</module>
</modules>
<!-- 放共有的依赖 -->
<dependencies>
<!-- 所有的子工程都会用nacos来注册服务 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 统一依赖版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-dependencies}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-nacos-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-openfeign-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>${spring-cloud-gateway-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>${ali-csp-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>${ali-csp-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.创建网关项目,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>com.xiao</groupId>
<artifactId>springcloud-001</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.xiao</groupId>
<artifactId>springcloud-gateway</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 9001
spring:
application:
name: springcloud-gateway
cloud:
nacos:
discovery:
server-addr: 192.168.64.19:8848
gateway:
routes:
- id: springcloud-consumer
uri: lb://springcloud-consumer
predicates:
- Path=/consumer/*
4.创建提供项目,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.xiao</groupId>
<artifactId>springcloud-001</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.xiao</groupId>
<artifactId>springcloud-provider</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 9002
spring:
application:
name: springcloud-provider
cloud:
nacos:
discovery:
server-addr: 192.168.64.19:8848
MusicController.java
package com.xiao.provider.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class MusicController {
@RequestMapping("/provider/musicplay")
public String musicPlay(@RequestParam String musicPath){
log.info("播放音乐文件[{}]", musicPath);
return musicPath;
}
}
5.创建api工程,springcloud-api
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">
<parent>
<artifactId>springcloud-001</artifactId>
<groupId>com.xiao</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiao</groupId>
<artifactId>springcloud-api</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
MusicClientFallbackFactory.java
package com.xiao.api.feign.factory;
import com.xiao.api.feign.MusicServiceClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 音乐服务降级处理
*
* @author xiaoss
* @since 1.0, 2022年07月27日 14:05:40
*/
@Slf4j
@Component
public class MusicClientFallbackFactory implements FallbackFactory<MusicServiceClient> {
@Override
public MusicServiceClient create(Throwable e) {
log.error("音乐服务接口异常,原因:{}", e.getMessage(), e);
return new MusicServiceClient() {
@Override
public String musicPlay(String musicPath) {
return "musicService服务器正在维护,请稍后再试!";
}
};
}
}
MusicServiceClient.java
package com.xiao.api.feign;
import com.xiao.api.constant.CloudServiceDefinitions;
import com.xiao.api.feign.factory.MusicClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 音乐服务接口客户端
*
* @author xiaoss
* @since 1.0, 2022年07月27日 14:08:01
*/
@FeignClient(contextId = "musicClient",name= CloudServiceDefinitions.PROVIDER_SERVICE,
fallbackFactory = MusicClientFallbackFactory.class)
public interface MusicServiceClient {
@GetMapping("/provider/musicplay")
String musicPlay(@RequestParam String musicPath);
}
6.创建服务消费工程,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.xiao</groupId>
<artifactId>springcloud-001</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.xiao</groupId>
<artifactId>springcloud-consumer</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
</dependency>
<dependency>
<groupId>com.xiao</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 9003
spring:
application:
name: springcloud-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.64.19:8848
sentinel:
transport:
port: 8719
dashboard: 192.168.233.130:9090
main:
allow-bean-definition-overriding: true
feign:
sentinel:
enabled: true
PlayerController.java
package com.xiao.consumer.controller;
import com.xiao.api.feign.MusicServiceClient;
import com.xiao.api.feign.VideoServiceClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@Slf4j
public class PlayerController {
@Resource
private MusicServiceClient musicServiceClient;
@Resource
private VideoServiceClient videoServiceClient;
@RequestMapping("/consumer/musicplay")
public String musicplay(@RequestParam String musicPath){
log.info("musicplay 调用!");
return musicServiceClient.musicPlay(musicPath);
}
@RequestMapping("/consumer/videoplay")
public String videoplay(@RequestParam String videoPath){
log.info("videoplay 调用!");
return videoServiceClient.videoPlay(videoPath);
}
@GetMapping("hello")
public String hello(){
return "hello";
}
}
7.测试
分别启动服务gateway、provider、consumer
使用postMan测试接口:
http://localhost:9001/consumer/musicplay?musicPath=1
源码下载地址:
链接:https://pan.baidu.com/s/1717J8lOKNRqq-S7aTYOw_g
提取码:ez84