4.在cloud-user中提供一个根据用户id查询用户信息的接口
package com.ymy.coulduser.controller;
import com.ymy.coulduser.vo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@RestController
@RefreshScope
@Slf4j
public class UserController {
private static Map<Integer,User> map = new ConcurrentHashMap<Integer, User>();
static {
User user1 = new User();
user1.setId(1);
user1.setUserName(“张三”);
user1.setAge(18);
map.put(1,user1);
User user2 = new User();
user2.setId(2);
user2.setUserName(“李四”);
user2.setAge(20);
map.put(2,user2);
}
@Value(“${test.name}”)
private String name;
@RequestMapping(value = “/test”,method = RequestMethod.GET)
public String getUserName(){
return “hello:”+name+" 人生总是起起落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落!";
}
@GetMapping(value = “userInfo”)
public User getUserInfo(@RequestParam(“userId”) Integer userId){
if(null == userId){
log.info(“用户id为空!”);
return null;
}
User user = map.get(userId);
return user;
}
}
这里我是模拟的,数据都是在Map中造的,这里的重点不是数据,而是服务调用的这个过程。
5.cloud-order中新建一个与cloud-user通信的接口类
内容为:
package com.ymy.feign;
import com.ymy.entity.vo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = “cloud-user”)
public interface UserClient {
@GetMapping(value = “userInfo”)
User getUserInfo(@RequestParam(“userId”) final Integer userId);
}
@FeignClient:表示该类是一个远程调用类,交给jdk动态代理处理。
value:需要调用的服务名。
TestController:
package com.ymy.controller;
import com.ymy.entity.vo.Order;
import com.ymy.entity.vo.User;
import com.ymy.feign.UserClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
@RestController
@Slf4j
@RefreshScope
public class TestController {
@Value(“${test.name}”)
private String name;
private UserClient userClient;
TestController(UserClient userClient){
this.userClient = userClient;
}
@GetMapping(value = “/test”)
public String test(){
return “hello:”+name+" 人生总是起起落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落落!";
}
@GetMapping(value = “orderInfo”)
public Order getOrderInfo(){
Order order = new Order();
order.setId(1);
order.setUserId(2);
order.setOorderPrice(BigDecimal.valueOf(100l));
order.setNum(2);
User userInfo = userClient.getUserInfo(order.getUserId());
if(null == userInfo){
log.info(“没有查询到用户信息”);
}
order.setUser(userInfo);
return order;
}
}
6.在启动类中开启feign远程调用
package com.ymy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class CloudOrderApplication {
public static void main(String[] args) {
SpringApplication.run(CloudOrderApplication.class, args);
}
}
@SpringBootApplication:springboot启动注解
@EnableDiscoveryClient:将服务注册到注册中心
@EnableFeignClients:开启feign,如果不加此注解,服务调用将不会成功。
7.启动cloud-eureka、cloud-config、cloud-user、cloud-order,测试
其中user则是cloud-order通过调用cloud-user服务拿到的,这是理想状态,如果出现意外情况呢?比如cloud-user服务宕机了会发生什么呢?,现在我停掉cloud-user服务,再次请求:
这是你会发现,服务器出现了报错,这种错误是不能出现在用户眼中的,有没有方法解决呢?
fallback 熔断机制
feign自带熔断,所以我们不需要在引入其他的依赖,feign的熔断有两种实现方式,如下:
第一种:实现类
什么是实现类呢?请注意看
UserClient是一个接口,这时候我们需要用一个类来实现这个接口
UserClientHystrix.java
package com.ymy.feign.hystrix;
import com.ymy.entity.vo.User;
import com.ymy.feign.UserClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UserClientHystrix implements UserClient {
@Override
public User getUserInfo(Integer userId) {
//这里就是当远程调用失败时,feign会自动进入接口的实现类,就是之前所说的熔断,
// 在这里,你可以做对应的处理,比如返回一个空的User对象,或者启用备用方案,调用联外一台服务等等。
//这里我们直接返回空User对象
log.info(“请求cloud-user服务发生错误”);
return null;
}
}
还需要一步那就是在接口指明实现类:
@FeignClient(value = “cloud-user”,fallback = UserClientHystrix.class)
重启cloud-order,cloud-user保持宕机状态:
发现报错了,而且还是和第一次的错误不一致,这是什么问题导致的呢?这是因为我们没有启动feign的熔断机制,默认时关闭状态,找到bootstrap.yml文件:
feign:
hystrix:
enabled: true #开启feign熔断
重启服务再次测试:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
希望可以给各位提供一些帮助:**
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
[外链图片转存中…(img-XOwSaVdW-1711583347203)]
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
[外链图片转存中…(img-5ewQGV3u-1711583347204)]
还有源码相关的阅读学习
[外链图片转存中…(img-lSj1YdwT-1711583347205)]