0


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

作用:

简化微服务间通信:

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

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

区别:

feign:同步:需要及时响应

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

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

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

有点tcp和udp那味儿了

feign使用:

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

  1. <!--openFeign-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. <version>选择合适的版本</version>
  6. </dependency>
  7. <!--负载均衡器-->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  11. <version>选择合适的版本</version>
  12. </dependency>

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

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

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

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

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

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

  1. @FeignClient(name = "service-provider")
  2. public interface ServiceClient {
  3. @GetMapping("/items/{id}")
  4. Item getItemById(@PathVariable("id") Long id);
  5. @PostMapping("/items")
  6. Item createItem(@RequestBody Item item);
  7. @PutMapping("/items")
  8. void updateItem(@RequestBody Item item);
  9. @DeleteMapping("/items/{id}")
  10. void deleteItemById(@PathVariable("id") Long id);
  11. }

provider的controller中的方法示例:

  1. @RestController
  2. @RequestMapping("/items")
  3. public class ItemController {
  4. @GetMapping("/{id}")
  5. public ResponseEntity<Item> getItemById(@PathVariable Long id) {
  6. // 业务逻辑
  7. }
  8. @PostMapping
  9. public ResponseEntity<Item> createItem(@RequestBody Item item) {
  10. // 业务逻辑
  11. }
  12. @PutMapping
  13. public ResponseEntity<Void> updateItem(@RequestBody Item item) {
  14. // 业务逻辑
  15. }
  16. @DeleteMapping("/{id}")
  17. public ResponseEntity<Void> deleteItemById(@PathVariable Long id) {
  18. // 业务逻辑
  19. }
  20. //其他接口
  21. }

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

  1. @Service
  2. public class ItemService {
  3. //注入编写的feign客户端
  4. @Autowired
  5. private final ServiceClient serviceClient;
  6. public Item getItem(Long id) {
  7. return serviceClient.getItemById(id);
  8. }
  9. public Item createItem(Item item) {
  10. return serviceClient.createItem(item);
  11. }
  12. public void updateItem(Item item) {
  13. serviceClient.updateItem(item);
  14. }
  15. public void deleteItem(Long id) {
  16. serviceClient.deleteItemById(id);
  17. }
  18. }

rabbitmq使用:SpringAmqp:rabbitmq的封装

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

windows: Installing RabbitMQ | RabbitMQ

docker:

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

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

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

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

  1. # application.yml
  2. spring:
  3. rabbitmq:
  4. host: rabbitmqip,是本地还是docker中的地址要搞清楚
  5. port: 5672
  6. username: 用户名
  7. password: 密码

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

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

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

  1. @Component
  2. @RequiredArgsConstructor
  3. public class MessageSender {
  4. private final RabbitTemplate rabbitTemplate;
  5. public void sendMessage(String message) {
  6. rabbitTemplate.convertAndSend("myExchange", "my.routing.key", message);
  7. }
  8. }

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

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

  1. @Bean
  2. public MessageConverter jsonMessageConverter() {
  3. return new Jackson2JsonMessageConverter();
  4. }
  5. @Bean
  6. public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
  7. final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
  8. rabbitTemplate.setMessageConverter(jsonMessageConverter());
  9. return rabbitTemplate;
  10. }

本文转载自: https://blog.csdn.net/weixin_75001968/article/details/138721076
版权归原作者 但要及时清醒 所有, 如有侵权,请联系我们删除。

“spring cloud--微服务--Feign和RabbitMQ”的评论:

还没有评论