spring cloud--微服务--Feign和RabbitMQ

作用:

简化微服务间通信:

体现在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;
}

  • 50
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据提供的引用内容,当出现"Failed to restart rabbitmp-server .service: Unit not found."错误时,可能是由于服务单元文件不存在导致的。你可以尝试以下方法来解决这个问题: 1. 检查服务单元文件是否存在:首先,你需要确认rabbitmp-server服务单元文件是否存在。你可以使用以下命令来检查: ```shell ls /etc/systemd/system/rabbitmp-server.service ``` 如果文件不存在,那么你需要创建一个新的服务单元文件。 2. 创建服务单元文件:如果rabbitmp-server服务单元文件不存在,你可以使用文本编辑器创建一个新的服务单元文件。例如,你可以使用以下命令创建一个名为rabbitmp-server.service的服务单元文件: ```shell sudo nano /etc/systemd/system/rabbitmp-server.service ``` 然后,将以下内容粘贴到文件中: ``` [Unit] Description=RabbitMP Server [Service] ExecStart=/path/to/rabbitmp-server [Install] WantedBy=multi-user.target ``` 请确保将`/path/to/rabbitmp-server`替换为rabbitmp-server的实际路径。 3. 重新加载服务配置:完成服务单元文件的创建后,你需要重新加载服务配置。你可以使用以下命令来重新加载服务配置: ```shell sudo systemctl daemon-reload ``` 4. 启动rabbitmp-server服务:重新加载服务配置后,你可以尝试启动rabbitmp-server服务: ```shell sudo systemctl start rabbitmp-server ``` 如果以上方法仍然无法解决问题,请提供更多关于你的操作系统和rabbitmp-server的详细信息,以便我能够提供更准确的帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值