作用:

简化微服务间通信:

体现在feign上就是:你(provider)提供服务接口,我(consumer)要使用;

体现在rabbitMQ上就是:我(provider)有命令给你(consumer),你(consumer)接收并进行处理

区别:

feign:同步:需要及时响应

rabbitmq:异步:不需要及时处理

就像黑马虎哥说的:同步--打电话需要对方立即回应才能进行对话

                                异步--发微信随时能与对方进行对话。

有点tcp和udp那味儿了

feign使用:

1:consumer服务中引入依赖---------------------------------------------------------------------------

  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
      <version>选择合适的版本</version>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
      <version>选择合适的版本</version>
  </dependency>

2:consumer服务启动类上添加注解@EnableFeignClients用来启用Feign客户端------

3:配置连接池提升性能(选做)-----------------------------------------------------------------------

<!--OK http 的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
  <version>选择合适的版本</version>
</dependency>
#yaml文件中配置
feign:
  okhttp:
    enabled: true # 开启OKHttp功能

4:编写feign接口:----------------------------------------------------------------------------------------

编写feign接口可以在consumer中编写,也可以新建一个服务模块专门来编写

这些接口是根据provider的controller层中的接口编写的

@FeignClient(name = "service-provider")
public interface ServiceClient {

    @GetMapping("/items/{id}")
    Item getItemById(@PathVariable("id") Long id);

    @PostMapping("/items")
    Item createItem(@RequestBody Item item);

    @PutMapping("/items")
    void updateItem(@RequestBody Item item);

    @DeleteMapping("/items/{id}")
    void deleteItemById(@PathVariable("id") Long id);
}

provider的controller中的方法示例:

@RestController
@RequestMapping("/items")
public class ItemController {



    @GetMapping("/{id}")
    public ResponseEntity<Item> getItemById(@PathVariable Long id) {
        // 业务逻辑
    }

    @PostMapping
    public ResponseEntity<Item> createItem(@RequestBody Item item) {
        // 业务逻辑
    }

    @PutMapping
    public ResponseEntity<Void> updateItem(@RequestBody Item item) {
        // 业务逻辑
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteItemById(@PathVariable Long id) {
        // 业务逻辑
    }

    //其他接口
}

5:使用--------------------------------------------------------------------------------------------------------

@Service
public class ItemService {

    //注入编写的feign客户端
    @Autowired
    private final ServiceClient serviceClient;


    public Item getItem(Long id) {
        return serviceClient.getItemById(id);
    }

    public Item createItem(Item item) {
        return serviceClient.createItem(item);
    }

    public void updateItem(Item item) {
        serviceClient.updateItem(item);
    }

    public void deleteItem(Long id) {
        serviceClient.deleteItemById(id);
    }
}

rabbitmq使用:SpringAmqp:rabbitmq的封装

1 安装:-------------------------------------------------------------------------------------------------------

windows: Installing RabbitMQ | RabbitMQ

docker:

docker run \
 -e RABBITMQ_DEFAULT_USER=用户名 \    //请删除我,仅作提示:用户名想要啥写啥
 -e RABBITMQ_DEFAULT_PASS=密码 \      //请删除我,仅作提示:密码想要啥写啥
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \              //请删除我,仅作提示:控制台端口
 -p 5672:5672 \                //请删除我,仅作提示:rabbitmq服务端口
 --network 网络名称\            //请删除我,仅作提示:自己配个网络
 -d \
 rabbitmq:3.8-management       //请删除我,仅作提示:版本有需要自己换

2 依赖:-------------------------------------------------------------------------------------------------------

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>选择自己需要的版本</version>
    </dependency>

3 yaml中配置:---------------------------------------------------------------------------------------------

# application.yml
spring:
  rabbitmq:
    host: rabbitmq的ip,是本地还是docker中的地址要搞清楚
    port: 5672
    username: 用户名
    password: 密码

4 consumer服务中进行监听-----------------------------------------------------------------------------

@Component
public class MessageListener {

    @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "myQueue", durable = "true"), //队列的信息:队列名称,进行持久化
        exchange = @Exchange(value = "myExchange", type = "topic"), //交换机:名称,类型
        key = "my.routing.key" //路由键
    ))
    public void listen(String message) {
        System.out.println("Received message: " + message);
    }
}

5 provider服务中发送消息-------------------------------------------------------------------------------

@Component
@RequiredArgsConstructor
public class MessageSender {

    private final RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {

        rabbitTemplate.convertAndSend("myExchange", "my.routing.key", message);
       
    }
}

6 消息转换器(可选)--consumer,provider都要加配置---------------------------------------

是为了兼容,便利性,反正配置了有好处

@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setMessageConverter(jsonMessageConverter());
    return rabbitTemplate;
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐