作用:
简化微服务间通信:
体现在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;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |