springcloudalibb框架介绍及搭建

1、springcloudalibb框架

     Spring Cloud Alibaba其实是阿里的微服务解决方案,是阿里巴巴结合自身微服务实践,开源的微服务全家桶。

常用组件:

Zuul: 做服务网关,它是整个微服务的大门,可以用来实现登录、权限检查等业务。

Eureka: 做服务注册与发现,用来解决服务之间通信问题。

Ribbon/OpenFeign:用做客户端的负载均衡,也就是解决将请求路由到微服务集群的问题 。

Hystrix:断路器,它的熔断、降级策略用来解决单节点故障 。

Config:分布式配置中心,用来统一管理配置所有微服务的配置文件 。

Bus:消息总线,用来给各个微服务广播消息,可以实现各个微服务配置的自动刷新 。

Sleuth:链路追踪,用来实时监控各个微服务建的调用关系,快速定位故障节点 。

2、 springcloudalibb框架搭建原理:

案列:

1、父子项目搭建spring-cloud-alibaba-test:

 1.1、导包:

 <!--父项目-->
    <packaging>pom</packaging>


    <!--管理springboot依赖-->
    <parent>
        <groupId> org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <!--SpringCloud依赖和SpringCloudAlibaba依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--公共类-->
    <dependencies>
        <!--测试类-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--log4j提供了方法使我们能将日志信息分级存储-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>

        <!--data用-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

1.2、子项目:

spring-cloud-alibaba-store
spring-cloud-alibaba-product
spring-cloud-alibaba-common-store
spring-cloud-alibaba-gateway

2、spring-cloud-alibaba-gateway网关服务搭建:

2.1导包:

 <dependencies>
        <!--服务网关,为了处理每个服务都要做的事情。你可以认为是切面变成了服务-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud </groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--Gateway聚合Swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

2.2、启动类配置:
 

package com.jd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
//注册客户端
@EnableDiscoveryClient
public class GatewayStarter {
    public static void main(String[] args) {
        SpringApplication.run(GatewayStarter.class);
    }
}

  2.3、xml注册 :

application.xml配置:可以配远程或本地自己选择

server:
  port: 10010
spring:
  application:
    name: service-gateway #服务名
  cloud: #注册到Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: false #开放服务名访问方式
          lower-case-service-id: true #服务名小写
      routes: #路由配置
        - id : application-product #指定服务名
          uri: lb://service-product #去注册中心找这个服务名
          predicates:    #断言,匹配访问的路径
            - Path=/product/**	#服务访问路径
          filters:
            - StripPrefix=1

        - id: application-store #指定服务名
          uri: lb://service-store #去注册中心找这个服务名
          predicates:    #断言,匹配访问的路径
            - Path=/store/**    #服务访问路径
          filters:
            - StripPrefix=1

      globalcors: #跨域配置
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allow-credentials: true
            allowed-headers: "*"
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
              - PATCH
              - OPTIONS
              - HEAD
              - CONNECT
              - TRACE
  #允许Bean覆盖
  main:
    allow-bean-definition-overriding: true

 bootstrap.xml配置 :

server:
  port: 10010
spring:
  profiles:
    active: dev
  application:
    name: product-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #注册中心
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-gateway #配置前缀 ,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
        namespace:  b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID

3、 spring-cloud-alibaba-store库存模块:

3.1 pom:

 <dependencies>
        <!--springbootnacos依赖-->
        <dependency>
            <groupId>com.alibaba.cloud </groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--加入WEB依赖是为了方便后面写Controller-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--        配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--客户端接入导入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!--Sentinel和Nacos做持久的-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.5.2</version>
        </dependency>

        <!--    &lt;!&ndash;,在SpringBoot启动时,去扫描所有Mapper接口,然后为其增加一个代理实现类,在调用的过程中,-->
        <!--我们实际调用的是这个代理对象  可以写,可以写在父类,建议写在当前子类&ndash;&gt;-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!--        &lt;!&ndash;连接数据库 可以写,可以写在父类,建议写在当前子类 注意版本号 &ndash;&gt;-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>


        <!--jdbc连接配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--公共依赖-->
        <dependency>
            <groupId>com.jd</groupId>
            <artifactId>spring-cloud-alibaba-common-store</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--导入openfeign包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--Feign整合Sentinel熔断-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>


        <!--引入swagger支持-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        <!--引入swagger支持-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>

3.2 启动类基础:

package com.jd;
import org.mybatis.spring.annotation.MapperScan;
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
@MapperScan("com.jd.mapper")
@EnableFeignClients
public class StoreStarter {
    public static void main(String[] args) {

        SpringApplication.run(StoreStarter.class);
    }
}

3.3 yml:

application:

#端口号
server:
  port: 10030
spring:
  #服务名
  application:
    name: service-store
  cloud:
    nacos:
      server-addr:  127.0.0.1:8848	#注册中心地址
      #Sentinel 依赖
    sentinel:
      transport:
        dashboard: localhost:1111
  #连接数据库
  datasource:
    url: jdbc:mysql://localhost:3306/jd-store?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: java

# 配置别名
mybatis:
  type-aliases-package: com.jd.domain

#配置sentinel:熔断
feign:
  sentinel:
    enabled: true #熔断

#测试用的,不用管
temp:
  notify: 2222



bootstrap.yml:

server:
  port: 10010
spring:
  profiles:
    active: dev
  application:
    name: store-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #注册中心
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-store #配置前缀 ,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
        namespace:  b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID

3.4 xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jd.mapper.StoreMapper">

    <!--   Store findOneByStore(Long id) ;;-->
    <select id="findOneByStore" resultType="com.jd.domain.Store">
        select * from t_store
        where  id = #{id};
    </select>

    <!--保存对象-->
    <!--  void insert(Store store);-->
    <insert id="insert"  parameterType="com.jd.domain.Store">
        insert into t_store(
            productId,
            number
        ) values(
                    #{productId},
                    #{number})
    </insert>


</mapper>

3.5 controller:

package com.jd.controller;
import com.jd.domain.Store;
import com.jd.feigh.ProductFeign;
import com.jd.server.IStoreServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/store")
public class StoreController {

    @Autowired
    private IStoreServer storeServer;
    @Autowired
    private ProductFeign productFeign;

    @GetMapping("/{id}")
    public Store findOneByStore(@PathVariable Long id){
       Store store =  storeServer.findOneByStore(id);



       return  store;
    }
    @PostMapping("/add")
    public void insert(@RequestBody Store store){
        storeServer.insert(store);
    }

    @PostMapping("/insert")
    public void insertNumber(@RequestBody Store store){
        Integer id = productFeign.insert(store.getProduct());
        store.setId(id);
        storeServer.insert(store);

    }
}

4、其他server 、domain mapper省略

4、spring-cloud-alibaba-product 商品模块:

1、基础依赖:

<?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>spring-cloud-alibaba-test</artifactId>
        <groupId>com.jd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-alibaba-product</artifactId>

    <dependencies>
        <!--springbootnacos依赖-->
        <dependency>
            <groupId>com.alibaba.cloud </groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--加入WEB依赖是为了方便后面写Controller-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--        配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

<!--        &lt;!&ndash;客户端接入导入sentinel依赖&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
<!--        </dependency>-->

<!--        &lt;!&ndash;Sentinel和Nacos做持久的&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.csp</groupId>-->
<!--            <artifactId>sentinel-datasource-nacos</artifactId>-->
<!--            <version>1.5.2</version>-->
<!--        </dependency>-->


        <!--,在SpringBoot启动时,去扫描所有Mapper接口,然后为其增加一个代理实现类,在调用的过程中,
我们实际调用的是这个代理对象  可以写,可以写在父类,建议写在当前子类-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

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

        <!--连接数据库 可以写,可以写在父类,建议写在当前子类 注意版本号 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--导入openfeign包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--Feign整合Sentinel熔断-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!--公共依赖-->
        <dependency>
            <groupId>com.jd</groupId>
            <artifactId>spring-cloud-alibaba-common-store</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


        <!--引入swagger支持-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
    </dependencies>
</project>

2、启动类:

package com.jd;
import org.mybatis.spring.annotation.MapperScan;
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
@MapperScan("com.jd.mapper")
public class ProductStarter {
    public static void main(String[] args) {
        SpringApplication.run(ProductStarter.class);
    }
}

3、yaml:

application.yaml:

#端口号
server:
  port: 10020
spring:
  main:
    allow-bean-definition-overriding: true
  #服务名
  application:
    name: service-product
  cloud:
    nacos:
      server-addr:  127.0.0.1:8848	#注册中心地址
      #Sentinel 依赖
    sentinel:
      transport:
        dashboard: localhost:1111
  #连接数据库
  datasource:
    url: jdbc:mysql://localhost:3306/jd-product?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: java



# 配置别名
mybatis:
  type-aliases-package: com.jd.domain

#配置sentinel:熔断
feign:
  sentinel:
    enabled: true #熔断

#测试用的,不用管
temp:
  notify: 2222




bootstrap.yml:

server:
  port: 10020
spring:
  profiles:
    active: dev
  application:
    name: product-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #注册中心
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-product #配置前缀 ,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
        namespace:  b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID

4、xm:

ProductMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jd.mapper.ProductMapper">

    <!--   Product findOneByProduct(Long id)-->
    <select id="findOneByProduct" resultMap="ProductMap">
        select p.*,s.id cid,s.number
        from `jd-product`.t_product p
                 left join `jd-store`.t_store s
                           on p.id  =  s.productId
        where p.id = #{id}
    </select>
    <resultMap id="ProductMap" type="com.jd.domain.Product">
        <id column="id" property="id" />
        <result column="name" property="name"/>
        <result column="price" property="price"/>

        <!--    private Store store;;-->
        <association property="store" javaType="com.jd.domain.Store">
            <id column="cid" property="id" />
            <result column="number" property="number"/>
        </association>
    </resultMap>

    <!--保存对象-->
    <!--          Product insert(Product product);;-->
    <insert id="insert" parameterType="com.jd.domain.Product"  >
        insert into t_product(
            name,
            price
        ) values(
                    #{name},
                    #{price})
    </insert>

<!--    <insert id="insert" parameterType="com.jd.domain.Product">-->
<!--        &lt;!&ndash;AFTER :insert 先执行.    &ndash;&gt;-->
<!--        <selectKey order="AFTER" keyProperty="id" resultType="int">-->
<!--            &lt;!&ndash; 获取最后一次执行insert语句的 key &ndash;&gt;-->
<!--            select LAST_INSERT_ID()-->
<!--        </selectKey>-->
<!--        insert into `jd-store`.t_store(id, name, gender, birthday, phone, idCard)-->
<!--        values(#{id}, #{name}, #{gender},#{birthday},#{phone},#{idcard})-->
<!--    </insert>-->



    <!--    &lt;!&ndash;删除对象&ndash;&gt;-->
<!--    <delete id="delete" parameterType="long">-->
<!--        delete from t_user where id = #{id}-->
<!--    </delete>-->

<!--    &lt;!&ndash;更新对象&ndash;&gt;-->
<!--    <update id="update" parameterType="User">-->
<!--        update t_user-->
<!--        set-->

<!--            username = #{username},-->
<!--            phone = #{phone},-->
<!--            email = #{email},-->
<!--            salt = #{salt},-->
<!--            password = #{password},-->
<!--            state = #{state},-->
<!--            age = #{age},-->
<!--            createtime = #{createtime},-->
<!--            headImg = #{headImg},-->
<!--            logininfo_id = #{logininfoId}        where id = #{id}-->
<!--    </update>-->

</mapper>

5、controller:

package com.jd.controller;
import com.jd.domain.Product;
import com.jd.domain.Store;
import com.jd.feigh.StoreFeign;
import com.jd.feigh.StoreInsertFeign;
import com.jd.server.IProductServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private IProductServer productServer;

    @Autowired
    private StoreFeign storeFeign;


    @Autowired
    private StoreInsertFeign storeInsertFeign;


    @GetMapping("/{id}")
    public Product findOneByStore(@PathVariable Long id){
        Product product =  productServer.findOneByProduct(id);
        Store oneByStore = storeFeign.findOneByStore(id);
        product.setStore(oneByStore);
        return  product;

    }

    @PostMapping("/add")
    public void insert(@RequestBody Product product ){
          productServer.insert(product);
        Integer productId = product.getId();
        Integer number = product.getNumber();

        Store store = new Store();
        store.setProductId(productId);
        store.setNumber(number);

        storeInsertFeign.insert(store);

    }

}

对于服务之间的调用当然是通过rpc调用,要比我们自己手动拼接url的好:

Spring Cloud Alibaba整合了Feign,使用Fegin实现服务之间的调用,默认集成Ribbon,可以实现负载均衡。

 什么是Feign

Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。同时Feign整合了Hystrix,可以很容易的实现服务熔断和降级 。


Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Fegin默认实现负载均衡的效果。

Fegin原理:

本项目实战为例带你快速了解Fegin基本使用:

分析需求:需要通过Feign调用库存服务把商品的数量保存到库存表。

1、导包:


        <!--导入openfeign包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--Feign整合Sentinel熔断-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

2、启动类加上:

开启fegin客户端

@EnableFeignClients

3、构建一个Fegin类

package com.jd.feigh;
import com.jd.domain.Store;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(value = "store-server",fallbackFactory = ProductFeignStoreFactoryInsert.class)
public interface StoreInsertFeign {
    @PostMapping("/store/add")
    void insert(@RequestBody Store store);
}

4、降级处理:

package com.jd.feigh;
import com.jd.domain.Store;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class ProductFeignStoreFactoryInsert   implements FallbackFactory<StoreInsertFeign> {
    @Override
    public StoreInsertFeign create(Throwable e) {
        return new StoreInsertFeign() {
            @Override
            public void insert(Store store) {
                e.printStackTrace();
                System.out.println(new Store(-1,-2,-3,null));
            }
        };
    }
}

4、业务代码思路:在商品构建一个  number字段接受前段参数,以商品id为productId保存到库存中,这样两个表添加时,使用一个id。(由于业务很少,就在Controller处理结果,本文章主要带大家了解springcloudalibb微服务代建以及Fegin基本使用

代码:

 @PostMapping("/add")
    public void insert(@RequestBody Product product ){
          productServer.insert(product);
        Integer productId = product.getId();
        Integer number = product.getNumber();

        Store store = new Store();
        store.setProductId(productId);
        store.setNumber(number);

        storeInsertFeign.insert(store);


    }

注意事项:Feign接口的参数是一个对象的时候需要使用:@RequestBody 标签

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值