作用:
简化微服务间通信:
体现在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;
}
版权归原作者 但要及时清醒 所有, 如有侵权,请联系我们删除。