当前位置:   article > 正文

黑马微服务教程_黑马 resttemplate 对接外部

黑马 resttemplate 对接外部

1. 远程调用

通过RestTemplate实现基于http的远程调用:

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate () {
   
        return new RestTemplate();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在controller中即可通过http地址调用其它服务的方法:

   @Autowired
   private RestTemplate restTemplate;

   @GetMapping("{orderId}")
   public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
   
       // 根据id查询订单并返回
       Order order = orderService.queryOrderById(orderId);
       // 发起http请求
       User user = restTemplate.getForObject("http://userservice/user/" + order.getUserId(), User.class);
       order.setUser(user);
       return order;
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. Eureka

Eureka是基于REST的服务发现框架,基本操作:

REST: Representational State Transfer,表现状态转移,是一种前后端分离的接口规范

  1. 每一个URI代表一种资源;
  2. 同一种资源有多种表现形式(xml/json);
  3. 所有的操作都是无状态的。
  4. 规范统一接口。
  5. 返回一致的数据格式。
  6. 可缓存(客户端可以缓存响应的内容)。

Eureka基本操作
代码如下:

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
   
    public static void main(String[] args) {
   
        SpringApplication.run(EurekaApplication.class, args);
    }

    @Bean
    public IRule randomRule() {
   
        return new RandomRule();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3. Ribbon

为了:

如何在配置Eureka Client注册中心时不去硬编码Eureka Server的地址?
在微服务不同模块间进行通信时,如何不去硬编码服务提供者的地址?
当部署多个相同微服务时,如何实现请求时的负载均衡?

因此,Ribbon是一个客户端负载均衡器,基本原理如图:
Ribbon负载均衡
可以通过实现IRule接口实现全局的负载均衡策略:

7种负载均衡策略:

  1. RoundRobinRule: 轮询
  2. ZoneAvoidanceRule: 区域敏感策略(默认),根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,即为轮询。
  3. WeightedResponseTimeRule: 权重策略,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大
  4. RandomRule: 随机
  5. BestAvailableRule: 最小并发数策略,遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。
  6. RetryRule: 重试策略,轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null
  7. AvailabilityFilteringRule: 可用敏感性策略,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例
    @Bean
    public IRule randomRule() {
   
        return new RandomRule();
    }
  • 1
  • 2
  • 3
  • 4
  • 5

也可以通过配置文件指定某微服务的负载均衡策略:

userservice: # 服务名
  ribbon:
    NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 1
  • 2
  • 3
  • 懒加载:Ribbon会在首次访问时去创建负载均衡器,后续可以直接访问。这会造成一定的速度差异和某些bug,可以启用饥饿加载,即服务启动时拉取服务列表解决:
ribbon:
  eager-load:
    enabled: true
    clients: userservice # 指定对userservice启用饥饿加载
    	- userservice # 指定多个服务时换行加-
    	- orderservice
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4. Nacos

我人傻了…公司的jdk安装包只有jre,合着我用了这么久的open jdk o(╥﹏╥)o 赶紧重装一个

解决了,继续继续


nacos是阿里巴巴的注册中心,单机模式记得改startup.cmd中的配置为standalone,使用nacos就要把eureka的配置都注掉,两者都遵循spring cloud Commons。
使用nacos:

// 单机模式启动nacos
E:\nacos\bin>startup.cmd -m standalone

// 父项目引入依赖
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.2.5.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

// 子项目引入服务发现依赖
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

// 子项目yml配置地址
spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: BJ # 集群名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

即可在8848端口进入nacos管理界面

localhost:8848

4.1 服务多级存储模型

优先访问本地集群,跨地区调用延迟较高,通过cluster-name配置集群名称

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/939338
推荐阅读
相关标签
  

闽ICP备14008679号