三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式

 1.前言
nacos是第二代微服务SpringCloudAlibaba开源的一款注册中心和分布式配置中心组件,其功能上为第一代微服务SpringCloud中Eureka和Config的结合体。简而言之,Nacos可以实现分布式服务注册与发现和分布式配置中心功能。

Nacos官方文档: https://nacos.io/zh-cn/docs/what-is-nacos.html

 架构技术选型

  1. 核心框架 Spring Boot
  2. SOA Spring Cloud
  3. 安全框架 Spring Security Oauth2
  4. 注册中心/配置中心 Nacos 集群部署
  5. 网关 Spring Cloud Gateway 部署多套,使用nginx负载
  6. 链路监控 Skywalking
  7. 流量控制、熔断降级 Sentinel
  8. 数据库 Mysql
  9. 分布式事务 Seata
  10. 定时调度 xxl-job
  11. 缓存 Redis
  12. MQ RocketMq
  13. 持久框架 Mybatis Plus
  14. 搜索引擎 ElasticSearch
  15. 需要架构源码的朋友可以看我个人简介联系我

三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第1张图片

2.Nacos-discovery默认支持Ribbon负载均衡
为了保持好奇心,特地分析了一下SpringCloud常见的注册中心组件: Eureka、Consul、nacos等,默认都是集成并开启了Ribbon负载均衡,本节为nacos主题,我们分析下nacos的服务发现组件,不难看出,他也是默认集成并且支持ribbon负载均衡的。三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第2张图片
3.环境搭建
3.1.Product提供接口
 

package com.bruce.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @BelongsProject: springcloud-alibaba-nacos
 * @BelongsPackage: com.bruce.controller
 * @CreateTime: 2021-02-18 13:37
 * @Description: 生产者——>商品服务
 */
@Slf4j
@RestController
public class ProductController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/getProductMsg")
    public String getProductMsg() {
        log.info("开始调用商品服务信息啦");
        return "我是商品服务, 调用商品服务接口成功了===>> : " + port;
    }
}


3.2.Order消费商品的接口(3种方式)
 

package com.bruce.controller;

/**
 * @BelongsProject: springcloud-alibaba-nacos
 * @BelongsPackage: com.bruce.controller
 * @CreateTime: 2021-02-18 13:47
 * @Description: TODO
 */

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @desc:  消费者——>订单服务
 * @author: cao_wencao
 * @date: 2020-04-17 20:58
 */
@Slf4j
@RestController
public class OrderController {

    @Autowired(required = false)
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private DiscoveryClient discoveryClient;

    //方式一 :通过IP地址
    @GetMapping("/getProductMsg")
    public String getProductMsg() {
        String url = "http://127.0.0.1:8715/getProductMsg";
        String response = restTemplate.getForObject(url, String.class);
        log.info("response==>: {}",response);
        return response;
    }

    //方式二 :通过服务名(这种方式不可行,在Eureka中可以)
    @GetMapping("/getProductMsg2")
    public String getProductMsg2() {
        String url = "http://nacos-product/getProductMsg";
        String response = restTemplate.getForObject(url, String.class);
        log.info("response==>: {}",response);
        return response;
    }

    //方式三 :通过LoadBalancerClient获取服务调用地址进行调用
    @GetMapping("/getProductMsg3")
    public String getProductMsg3() {
        //discoveryClient.getInstances()
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-product");
        String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort() + "/getProductMsg");
        String response = restTemplate.getForObject(url, String.class);
        log.info("response结果==>>>: {}", response);
        return response;
    }

    //方式四 :通过LoadBalancerClient获取服务调用地址进行调用
    @GetMapping("/getProductMsg4")
    public String getProductMsg4() {
        List serviceInstanceList = discoveryClient.getInstances("nacos-product");
        //任意选择一个,实现本地RPC调用
        ServiceInstance serviceInstance = serviceInstanceList.get(0);
        String response = restTemplate.getForObject(serviceInstance.getUri()+ "/getProductMsg", String.class);
        log.info("response结果==>>>: {}", response);
        return response;
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}


4.基于RestTemplate测试

使用nacos做注册中心时,服务消费有两大类,一类是RestTemplate,另一类是Feign客户端,其中RestTemplate具体实现服务消费有3种方式

启动项目,先观察nacos控制台,发现服务都注册上去了

三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第3张图片
通过IP地址调用: http://127.0.0.1:8710/getProductMsg

三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第4张图片
通过LoadBalancerClient获取服务调用地址进行调用: http://127.0.0.1:8710/getProductMsg3

三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第5张图片
通过DiscoveryClient获取服务调用地址进行调用: http://127.0.0.1:8710/getProductMsg4

三、SpringCloud Alibaba + Spring Boot + mybatis +数据中台+多租户saas+前后端分离 服务调用之RestTemplate方式_第6张图片

你可能感兴趣的:(java,spring,cloud,spring,boot)