euraka服务器:
配置文件:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: true
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
product-api Api
FeignClient接口
@FeignClient(name = "PRODUCT-SERVER",fallback = ProductFeignHystrix.class)
public interface ProductFeignApi {
@GetMapping("/api/v1/product/find")
Product find(@RequestParam("id") Long id);
}
@Component
public class ProductFeignHystrix implements ProductFeignApi {
@Override
public Product find(Long id) {
System.out.println("兜底数据");
return null;
}
}
服务端:
配置
spring:
application:
name: product-server
cloud:
config:
discovery:
service-id: config-server
enabled: true
label: master
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
@RestController
@Slf4j
public class ProductFeignClient implements ProductFeignApi {
@Autowired
private IProductService productService;
@Value("${server.port}")
private String port;
@Override
public Product find(Long id) {
log.info("ProductFeignClient查找商品");
Product product = productService.get(id);
Product result = new Product();
BeanUtils.copyProperties(product,result);
result.setName(result.getName()+",data from "+port);
System.out.println("进入....."+port);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return result;
}
}
@Service
public class ProductServiceImpl implements IProductService {
@Autowired
private ProductMapper productMapper;
@Override
public List<Product> list() {
return productMapper.list();
}
@Override
public Product get(Long id) {
return productMapper.get(id);
}
}
@SpringBootApplication
public class ProductServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServerApplication.class, args);
}
}
订单服务
spring:
application:
name: order-server
cloud:
config:
discovery:
service-id: config-server
enabled: true
label: master
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
@Slf4j
@RestController
@RequestMapping("/api/v1/order")
public class OrderController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private IOrderService orderService;
@HystrixCommand(fallbackMethod = "saveFail")
@RequestMapping("/save")
public Order save(Long userId, Long productId, HttpServletRequest request){
log.info("Controller开始下单");
String token = request.getHeader("token");
String cookie = request.getHeader("Cookie");
System.out.println("token="+token+",cookie="+cookie);
return orderService.save(userId,productId);
}
public Order saveFail(Long userId,Long productId, HttpServletRequest request){
System.out.println("in.");
new Thread(()->{
String redisKey = "order-save";
String value = stringRedisTemplate.opsForValue().get(redisKey);
if(StringUtils.isEmpty(value)){
System.out.println("order下订单服务失败,请查找原因.");
stringRedisTemplate.opsForValue().set(redisKey,"save-order-fail",20, TimeUnit.SECONDS);
}else{
System.out.println("已经发送过短信");
}
}).start();
return new Order();
}
}
@Slf4j
@Service
public class OrderServiceImpl implements IOrderService {
@Autowired
private ProductFeignApi productFeignApi;
@Override
public Order save(Long userId, Long productId) {
log.info("OrderServiceImpl开始下单");
Product product = productFeignApi.find(productId);
if(product==null){
System.out.println("调用远程服务异常");
}
Order order = new Order();
order.setOrderNo(UUID.randomUUID().toString().replace("-",""));
order.setCreateTime(new Date());
order.setUserId(userId);
if(product==null){
System.out.println("调用远程服务异常");
}else{
order.setProductName(product.getName());
order.setProductPrice(product.getPrice());
}
System.out.println("执行保存订单操作");
return order;
}
}
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class OrderServerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServerApplication.class, args);
}
}
网关配置
server:
port: 9000
spring:
application:
name: zuul-server
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
ignoredPatterns: /*-server/**
routes:
order-server-route:
path: /order/**
serviceId: order-server
sensitiveHeaders:
product-server-route:
path: /product/**
serviceId: product-server
order-server:
ribbon:
ConnectTimeout: 6000
ReadTimeout: 6000
@Component
public class AuthZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
if(request.getRequestURI().indexOf("/order/api/")>=0){
return true;
}
return false;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String cookie = request.getHeader("Cookie");
if(StringUtils.isEmpty(cookie)){
cookie = request.getParameter("Cookie");
}
if(StringUtils.isEmpty(cookie)){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
}
}
配置文件:
server:
port: 9100
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri:
username:
password:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
management:
endpoints:
web:
exposure:
include: "*"
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}