java电商项目搭建-------openfeign的服务调用(熔断机制和负载均衡)

本文介绍了微服务架构中服务调用的工具,如OpenFeign、RPC和Dubbo,并重点讲解了Zookeeper+Dubbo和Eureka+OpenFeign的组合。通过示例展示了如何使用OpenFeign进行服务调用,以及集成Hystrix实现熔断和降级策略,确保系统高可用。文中还包含了服务调用方、提供方的配置和代码实现,以及服务注册与发现的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人之所以痛苦,那是因为你在成长。--------magic_guo

在微服务项目中,各个服务都部署在不同的服务器上,业务线上服务之间相互调用;话说回来,现在流行的几个服务调用工具openfeign、RPC、dubbo;

RPC—Remote Produce Call(远程过程调用),主要是通过自定义通信规则,自定义数据格式来实现通信。其实这要求通信两端都需要统一通信规则,必须约定好数据传输格式;

在我看来最流行的是:zookeeper+dubbo和eureka+openfeign两种注册中心和服务调用;
dubbo:暴露接口;
openfeign:暴露url path;是一个声明式的restful客户端,底层是httpClient,在这个基础上进行了封装使得结构更加清晰,调用方式更加简单;并且feign中集成了Hystrix(熔断降级)和Ribbon(负载均衡),保证了系统的高可用;

熔断降级:
发生情况:系统负载过高,突发流量 或者网络异常等
熔断:
微服务相互调用时,某个服务突然挂掉,会标记该服务为不可用并暂时停止调用,之后会尝试调用,如果正常运行则调用,否则则继续停用;

降级:
主动抛弃一些非必要的数据;

相同点:
1、从可用性和可靠性出发,防止系统崩溃
2、最终让用户体验到的事某些功能暂时不能用
不同点:
熔断一般是由下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制

我使用的是feign的服务调用:
服务调用方:shop-back
服务提供方:shop-user、shop-user1;(但是这两个服务名字都是shop-user)
中间层:shop-feign

此模块可以是一个maven工程,也可使一个spring服务工程;两种搭建方式我都是用了;感觉还是maven模块搭建比较好,是用模块搭建,部署的时候使用jar包的形式引入,不用担心调用服务出现问题;(推荐将feign搭建成一个maven模块)
本文是将feign搭建成一个web服务,和maven模块搭建一样,不同的是多了一个web依赖:

shop-feign服务搭建:
依赖解释:config客户端、eureka客户端、shop-entity公共模块、web模块、feign的依赖、熔断机制的依赖;
pom文件:

<?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.guo</groupId>
        <artifactId>shop-pom</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.guo</groupId>
    <artifactId>shop-feign</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>shop-feign</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.guo</groupId>
            <artifactId>shop-entity</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

目录结构:
在这里插入图片描述
IUserService是feign调用服务的接口:
将shop-user的所有controller层的接口拿过来,将后面的中括号去掉;可以在接口上添加@RequestMapping也可以在方法上写@RequestMapping;

// value是调用的服务的模块名称;fallback是如果调用失败,则回调本地的服务;
@FeignClient(value = "shop-user", fallback = UserServiceImpl.class)
@Component
public interface IUserService {

    @RequestMapping("/user/addUser")
    public ResultEntity addUser(@RequestBody User user);
}

UserServiceImpl:

// 如果远程调用失败,则熔断调用本地的方法;
@Component
public class UserServiceImpl implements IUserService {

    private ResultEntity getMessage() {
        return ResultEntity.error("系统正在维护, 请联系管理员.......");
    }
    @Override
    public ResultEntity addUser(User user) {
        return getMessage();
    }
}

启动类:

@SpringBootApplication(scanBasePackages = "com.guo", exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
public class ShopFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShopFeignApplication.class, args);
    }
}

配置:
在config配置中心添加feign的配置:

feign:
  hystrix:
    enabled: true

hystrix:
  shareSecurityContext: true
  command:
    default:
      circuitBreaker:
        requestVolumeThreshold: 1
        sleepWindowInMilliseconds: 15000
        forceOpen: false
        forceClosed: false
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

ribbon:
  ConnectTimeout: 4000
  ReadTimeout: 4000

bootstrap.yml配置:

server:
  port: 8004
spring:
  application:
    name: shop-feign
  cloud:
    config:
      profile: shop-feign, log, eureka-client
      name: application
      uri: http://localhost:9999

shop-back构建:
pom文件:

<?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.guo</groupId>
        <artifactId>shop-pom</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.guo</groupId>
    <artifactId>shop-back</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>shop-back</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.guo</groupId>
            <artifactId>shop-feign</artifactId>
        </dependency>

        <dependency>
            <groupId>com.guo</groupId>
            <artifactId>shop-entity</artifactId>
        </dependency>

    </dependencies>

</project>

目录结构:
在这里插入图片描述
UserController:
shop-back的接口,注入feign的IUserService,然后feign再根据接口,来调用真实的shop-user应用的服务:

@RestController
@Slf4j
@RequestMapping("/userController")
public class UserController {

//    @Autowired
    @Resource
    IUserService userService;

    @RequestMapping("/addUser")
    public ResultEntity addUser(User user) {
        return ResultEntity.success(userService.addUser(user));
    }
}

启动类:
以为此模块不连接数据库,同时又有了数据源的依赖和配置,因此将此配置去除,否则服务启动不起来;
@EnableFeignClients注解:需要声明此注解是服务消费方(即调用方),,并且标识调用的feign接口位置;

@SpringBootApplication(scanBasePackages = "com.guo", exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients("com.guo.api")
public class ShopBackApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopBackApplication.class, args);
    }
}

bootstrap.yml:

spring:
  cloud:
    config:
      name: application
      profile: shop-back, log, eureka-client, shop-feign
      uri: http://localhost:9999

shop-user、shop-user1服务提供方构建:
在真实的线上环境,这两个服务application name是一样的,可能部署在不同的服务器上,可以利用负载均衡,来降低服务器压力;平时访问两个服务,如果一个有问题,不至于此服务停止;目的还是保持应用的高可用;

这两个模块是一样的,只不过端口不一样,在eureka注册中心,会显示两个shop-user的服务提供者,此模块在上一篇已经搭建完成:shop-user搭建
不同点:
shop-user的配置:

server:
  port: 8001
spring:
  application:
    name: shop-user

shop-user1的配置:

server:
  port: 8002
spring:
  application:
    name: shop-user

搭建完成后,启动相关模块和这几个模块;纠错原则:
端口是否正确、启动过程中有没有错误、eureka注册中心是否都已注册上、调试接口是否返回数据正确;
在这里插入图片描述
eureka注册中心:
在这里插入图片描述
调试接口:
在两个服务提供方都正常启动的情况下:
负载均衡:
Ribbon的的负载均衡策略有很多,可以在配置中心进行修改;我使用的是默认的轮训策略;

调用8001端口的服务:
在这里插入图片描述
调用8002端口的服务:
在这里插入图片描述
只有一个服务提供方:
关闭其中一个服务,则会一直调用启动的服务;

关闭掉全部的服务提供方:
则会调用配置的回调ServiceImpl:
在这里插入图片描述


本文章教学视频来自:https://www.bilibili.com/video/BV1tb4y1Q74E?p=3&t=125


静下心,慢慢来,会很快!

<think>好的,现在用户问现在是不是大部分公司都要会微服务架构。首先,我需要理解用户的问题。用户可能是在考虑学习方向,或者准备求职,想知道微服务是否是必备技能。之前的对话中,用户询问了Java实习岗的技术要求,我提到了微服务基础是主流技术框架之一,属于需要掌握的方向。现在这个问题更具体,需要详细分析微服务在行业中的普及情况。 接下来,我得考虑当前行业趋势。确实,微服务架构在互联网公司有一定规模的企业中被广泛采用,尤其是需要快速迭代高并发的场景。但并非所有公司都使用,传统企业或小型项目可能还在用单体架构。因此,回答需要分情况讨论,不能一概而论。 用户可能担心如果不会微服务,是否会影响求职机会。需要指出微服务的重要性,同时也要说明学习路径,比如掌握Spring Cloud Alibaba等,以及实际项目经验的重要性。另外,要提到即使不是所有公司都要求,但作为主流技术,掌握它确实能提升竞争力。 还要注意用户可能的背景。如果是学生或刚入行的开发者,他们可能更关注学习重点。因此,建议部分需要具体,比如推荐学习哪些框架,如何实践,是否需要深入原理等。同时,可以提到加分项基础的重要性,避免用户只关注框架而忽视核心能力。 需要检查是否有遗漏点,比如微服务的优缺点,不同规模公司的需求差异,以及替代架构的存在。此外,是否需要强调实际项目经验,比如通过开源项目或实习来积累经验,这也是用户之前问题中提到的内容。 最后,确保回答结构清晰,分点说明现状、学习建议、面试准备等,帮助用户全面理解。同时语言要口语化,避免过于技术化,让用户容易理解。还要注意不要过于绝对,保持客观,指出虽然重要但不是全部公司都要求,但掌握后机会更多。</think>从当前行业发展趋势来看,微服务架构确实已成为企业技术选型的主流方向,但具体掌握程度要求因公司规模业务场景而异。以下是分层解析: --- ### **一、企业采用现状** 1. **互联网大厂/中大型企业**(90%+要求) - 普遍基于Spring Cloud/Dubbo搭建微服务体系 - **必会基础**:服务注册发现(Nacos/Zookeeper)、API网关(Spring Cloud Gateway)、配置中心 - **典型场景**:电商秒杀、支付系统等需要弹性扩展的业务 2. **传统行业数字化转型企业**(约60%要求) - 逐步从单体架构向微服务迁移 - **侧重能力**:分布式事务(Seata)、服务监控(SkyWalking)、灰度发布 3. **初创公司/小型项目**(需求分化) - 早期可能采用单体架构(Spring Boot快速开发) - 用户量增长到10万级后开始考虑微服务化 --- ### **二、求职竞争力分析** #### (1)必须掌握的核心点 - **基础概念**: ```markdown - 服务拆分原则(领域驱动设计DDD基础) - 服务通信方式(HTTP vs RPC) - 熔断限流(Sentinel/Hystrix) ``` - **框架实践**: ```java // Spring Cloud OpenFeign声明式调用示例 @FeignClient(name = "user-service") public interface UserService { @GetMapping("/users/{id}") User getUser(@PathVariable Long id); } ``` #### (2)区分「会用」「理解」的要点 | 初级要求 | 进阶考察点 | |-----------------------|-------------------------| | 会写Feign接口调用 | 能解释OpenFeign底层如何生成动态代理 | | 会配置Nacos地址 | 理解CP/AP模型选择逻辑 | | 会使用@LoadBalanced注解 | 能手写轮询负载均衡算法 | --- ### **三、学习建议路线** 1. **学习优先级** - 先掌握单体开发(Spring Boot + MyBatis) - 再过渡到微服务(从「用户-订单」双服务案例入手) - 最后研究容器化部署(Docker + Kubernetes) 2. **低成本实践方案** - 本地用Docker同时启动Nacos + Redis + MySQL - 使用阿里云免费额度部署简单微服务([学生认证可获资源](https://developer.aliyun.com/plan/student)) ```bash # 本地开发环境快速启动 docker-compose -f nacos-server.yml up -d ``` 3. **面试高频问题准备** - "服务雪崩如何预防?"(回答要点:熔断+降级+限流) - "注册中心挂了会怎样?"(需解释本地缓存容灾机制) - "如何设计一个分布式ID生成器?"(可答Snowflake优化方案) --- ### **四、理性看待技术趋势** 1. **不要盲目跟风** - 单体架构在验证期项目仍具优势(开发效率高) - 微服务会显著增加运维复杂度(需配套监控/日志体系) 2. **企业真实需求层次** - 实习生:能理解架构图+在指导下完成模块开发 - 初级开发:能独立开发服务+排查常见通信问题 - 高级岗:需掌握服务网格(Service Mesh)、可观测性体系等 **建议**:可通过参与开源项目(如Spring Cloud Alibaba)的文档翻译或简单Bug修复,既积累经验又增强简历亮点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值