基于SpringCloud的微服务之通信与网关

微服务之间的通信:

微服务之间通信便是各微服务之间的相互调用,即远程调用;我们将在这里了解到两种通信方式:Feign&Dubbo

 项目案例:请勿向主分支提交代码icon-default.png?t=N6B9https://gitee.com/aizqy/spring-cloud.git

Fegin:

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。 Nacos很好的兼容了Feign, Feign默认集了Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果

基本使用:

1.加入Fegin的依赖

<!--fegin组件--> 
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency>

2.在启动器上添加Fegin的注解:@EnableFeignClients(开启Fegin)

3.创建一个service接口, 并使用Fegin实现微服务调用

@FeignClient("service-product")//声明调用的提供者
public interface ProductService {
    //指定调用的方法
    @GetMapping(value = "/product/select/{pid}")
    Product findByPid(@PathVariable("pid") Integer pid);
}

4.修改controller代码,并启动验证

        //Fegin实现
        Product product = productService.findByPid(pid);

Feign使用优化

因为Feign底层发起http请求,依赖于其它的框架,所以对Feign的优化就是使用连接池代替默认的URLConnection,这里我们用Apache的HttpClient来简单实现

1.加入依赖

<!--httpClient的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-httpclient</artifactId>
</dependency>

2.配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

3.做大量测试与没有优化时做对比会发现优化后的速度快于没有优化的速度

Dubbo:

Dubbo与Fegin最大的区别便是Dubbo是基于TCP而实现的,Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快

实现案例:

1.在公共类中提供统一业务API,并将实体类序列化:实现Serializable接口

public interface IProductService {
    Product findByPid(Integer pid); 
}
/**
实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置
*/

2.编辑服务提供者product

 2.1添加依赖

<!--dubbo--> 
<dependency>
  <groupId>com.alibaba.cloud</groupId> 
  <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

 2.2配置类中添加Dubbo配置

dubbo: 
    scan: 
        base-packages: com.apesource.service.impl # 开启包扫描
    protocols: 
        dubbo: 
            name: dubbo # 服务协议 
            port: -1 # 服务端口 使用随机端口
    registry: 
        address: spring-cloud://localhost # 注册中心

 2.3编写并暴露服务

//暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
@Service 
    public class ProductServiceImpl implements ProductService {
        @Autowired 
        private ProductDao productDao; 
        @Override
        public Product findByPid(Integer pid) {
            return productDao.findById(pid);
        }
    }

3.编辑服务消费者order

3.1添加依赖

<!--dubbo--> 
<dependency> 
  <groupId>com.alibaba.cloud</groupId> 
  <artifactId>spring-cloud-starter-dubbo</artifactId> 
</dependency>

3.2配置类中添加Dubbo配置

dubbo: 
    registry: 
        address: spring-cloud://localhost # 注册中心
    cloud: 
        subscribed-services: service-product # 订阅的提供者名称

3.3引用服务并测试

@RestController 
    public class OrderController {
        @Autowired 
        private OrderService orderService; 
        //引用服务 
        @Reference 
        private IProductService productService; 
        @RequestMapping("/order/prod/{pid}") 
        public Order order(@PathVariable Integer pid) { 
            System.out.println("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息"+pid); 
            //调用商品微服务,查询商品信息
            Product product = productService.findByPid(pid); 
            System.out.println("查询到{}号商品的信息,内容是:{}"+JSON.toJSONString(product)); 
            //下单(创建订单) 
            Order order = new Order(); 
            order.setUid(1); 
            order.setUsername("测试用户");
            order.setPid(pid);
            order.setPname(product.getPname()); 
            order.setPprice(product.getPprice());
            order.setNumber(1);
            orderService.createOrder(order);
            System.out.println("创建订单成功,订单信息为{}"+JSON.toJSONString(order));
            return order;
        } 

微服务中的网关:

当一个大型项目中各服务增多时,请求端口也会随之增多,因此便需要网关做端口的统一管理,请求访问网关,网关通过配置自主分配访问资源,大大方便了项目的管理,网关的核心功能特性:
请求路由、权限控制、限流

Gateway服务网关:

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

gateway简单实现:

1.在原有项目中创建一个 api-gateway 的模块,导入相关依赖

<!--网关-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖(gateway高级使用需要)-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.编写基础配置和路由规则:在application.yml中配置

#启动类添加注解@EnableDiscoveryClient,项目添加坐标
server:
  port: 7000
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true # 让gateway可以发现nacos中的微服务
      routes:
        - id: product_route
          uri: lb://service-product # lb指的是从nacos中按照名称获取微服务,并遵循负载均 衡策略
          order: 1
          predicates:
            - Path=/product-G/**
          filters:
            - StripPrefix=1

3.测试:可以看到我们直接访问7000端口便可以实现服务调用 

向上攀爬的痛苦,终会在登顶时烟消云散
——ZQY

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟0917

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值