

在pom中将spring boot做为父项目,配置整体项目的一些依赖
<parent>
<artifactId>spring-boot-starter-parentartifactId>
<groupId>org.springframework.bootgroupId>
<version>2.3.12.RELEASEversion>
parent>
添加cloud版本依赖,lombok依赖
<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.0modelVersion>
<groupId>org.dcitsgroupId>
<artifactId>04-feign-projectartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<artifactId>spring-boot-starter-parentartifactId>
<groupId>org.springframework.bootgroupId>
<version>2.3.12.RELEASEversion>
parent>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Hoxton.SR12spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
build>
project>
创建一个maven模块,将父类指向04-feign-project
此时会发现父类的pom中多了内容

父项目指向04-feign-project

同样指定父类

api需要依赖domain,在pom中添加依赖
<dependencies>
<dependency>
<groupId>org.dcitsgroupId>
<artifactId>project-domainartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>

order和user模块需要依赖api
<dependencies>
<dependency>
<groupId>org.dcitsgroupId>
<artifactId>common-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>

注意包名要一致
创建Order类
package com.dcits.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Order {
private Integer orderId;
private String name;
private Double price;
}
分析order需要依赖有web支持,需要eureka注册所以需要eureka依赖,项目要部署的话需要对order模块进行打包,所以需要打包插件
<dependencies>
<dependency>
<groupId>org.dcitsgroupId>
<artifactId>common-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
写一个启动类
package com.dcits;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApp {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApp.class,args);
}
}
写一个接口
@RestController
public class OrderController {
}
这里需要调用feign,方法签名是提供者和使用者都需要的,所以可以将这个共同需要的放入到api模块中
在api中添加openFeign的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
创建Feign的接口
@FeignClient(value = "order-service")
public interface UserOrderFeign {
//查询订单
@GetMapping("/order/gerOrderByUserId")
Order gerOrderByUserId(@RequestParam Integer userId);
}
这样只需要在order-service的controller中实现这个接口即可
package com.dcits.contorller;
import com.dcits.domain.Order;
import com.dcits.feign.UserOrderFeign;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController implements UserOrderFeign {
@Override
public Order gerOrderByUserId(Integer userId) {
System.out.println(userId);
Order order = Order.builder().name("红烧肉").price(20D).orderId(1).build();
return order;
}
}
接着修改yml文件
server:
port: 8081
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
ribbon:
ReadTimeOut: 3000 # 给3s超时时间
ConnectTimeout: 3000 # 连接服务超时时间
logging:
level:
com.dcits.userserver.feign.UserOrderFeign: debug # 需要打印这个接口下面的日志
同样给user-center模块加yml文件,修改下名和端口号
server:
port: 8082
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
ribbon:
ReadTimeOut: 3000 # 给3s超时时间
ConnectTimeout: 3000 # 连接服务超时时间
logging:
level:
com.dcits.userserver.feign.UserOrderFeign: debug # 需要打印这个接口下面的日志
feign:
hystrix:
enabled: true
分析user-center模块需要web,eureka,hystrix
<dependencies>
<dependency>
<groupId>org.dcitsgroupId>
<artifactId>common-apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
dependencies>
写main方法
package com.dcits;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserServiceApp {
public static void main(String[] args) {
SpringApplication.run(UserServiceApp.class,args);
}
}
写controller
package com.dcits.controller;
import com.dcits.domain.Order;
import com.dcits.feign.UserOrderFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
public UserOrderFeign userOrderFeign;
@GetMapping("find")
public Order find(){
return userOrderFeign.gerOrderByUserId(1);
}
}
熔断可以在user下写,也可以在api中,这里选择在api中
package com.dcits.feign.hystrix;
import com.dcits.domain.Order;
import com.dcits.feign.UserOrderFeign;
import org.springframework.stereotype.Component;
@Component
public class UserHyxtrix implements UserOrderFeign {
@Override
public Order gerOrderByUserId(Integer userId) {
return null;
}
}

将feign参数补全
@FeignClient(value = "order-service",fallback = UserHyxtrix.class)
测试:

测试熔断:
