微服务Nacos\LoadBalancerClient\R

一. 先要一个服务的管理平台Nacos(注册,发现,配置)

1.解压nacos或下载(https://github.com/alibaba/nacos/releases)(版本1.4.1)

2.在数据库执行config文件中nacos-mysql.sql脚本(脚本可能不带创建库)

3.打开/conf/application.properties文件,配置数据源和数据库

4.windows打开Nacosstartup.cmd -m standalone(要么bin目录cmd,要么配置环境变量)

5.localhost:8848打开,默认账号密码为nacos/nacos

二. 需要一个消费服务方来调用提供服务方,都注册到Nacos

1. 创一个parent工程(01-sca),分别让消费和提供继承

1.1 pom文件中三个依赖 SpringBoot, SpringCloud, SpringCloudAlibaba

2. 创建提供方服务工程(sca-provider)

2.1 pom文件中两依赖 Web(spring-boot-starter-web)和服务注册和发现nacos(spring-cloud-starter-alibaba-nacos-discovery)

2.2 创建并修改配置文件application.yml

server:
   port: 8081
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

2.3 创建启动类,定义控制层和方法,让其消费服务调用

3. 创建消费服务方

3.1 pom文件的两依赖 Web和注册服务到Nacos

3.2 修改配置文件application.yml

3.3 创建启动类通过RestTemplate(客户端)调用提供方

3.3.1 new一个RestTemplate(客户端)方法,通过@Bean交给Spring容器管理
3.3.2 注入到controller类,restTemplate自带的方法getForObject(提供方url,返回值的class)

3.4 启动消费方和提供方的服务,调用消费方的方法,会自动访问提供方的方法

三. 访问成功再实现负载均衡,提供方多在nacos部署几个服务(换端口启动,需在提供方设置(Allow parallel run)并发 (四种负载均衡)

3.1 手写随机算法,将服务都放到数组,通过下标静态实现负载均衡

3.2 注入LoadBalancerClient对象,通过loadBalancerClient.choose(“sca-provider”)动态获取IP和端口,拼接url实现服务之间调用

3.3 使用@LoadBalanced对构建RestTemplate的方法进行修饰,再注入loadBalancedRestTemplate,Spring会为其设置LoadBalancerInterceptor的拦截器,拦截器获取端口和IP,直接拼接url实现服务之间调用 相比3.2简化代码,降低了效率.

String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);

3.4 基于Feign的远程服务调用,看五

四. Spring Cloud核心组件 Ribbon

4.1 负载均衡实现默认是因为Nacos集成了Ribbon来实现的

4.2 基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口

4.3 Ribbon 内置的负载策略有8种,查看IRule接口的实现类进行分析

4.4 Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务

五. 基于Feign的远程服务调用

5.1 特点

1 服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生。
2 底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现
3 Feign 最早是由 Netflix 公司进行维护的,后来 Netflix 不再对其进行维护,最终 Feign 由一些社区进行维护,更名为 OpenFeign。
4 可以更好的创建层次结构dao,service,controller

5.2 在服务消费方添加OpenFeign依赖(spring-cloud-starter-openfeign)

5.3 在启动类添加@EnableFeignClients,扫描包下所由@FeignClient注解描述的接口

5.4 写一个接口 @FeignClient,底层自动创建实现类

/**
 * @FeignClient 注解用于描述远程服务调用接口,这个接口不需要你写实现类,你
 * 只需要定义访问规则即可(例如请求方式,请求url,请求参数).
 * @FeignClient注解描述的接口的实现类对象会默认交给spring管理,这个bean对象
 * 的名字默认就是name属性指定的值,这个name还有一个层面的含义,就是你远程调用的
 * 服务名.
 * 说明:假如@FeignClient注解中添加了contextId属性,则这个属性值默认
 * 会作为当前bean对象的名字,此时name的值仅仅作为要调用的服务名对待,一般
 * 推荐contextId的值默认为@FeignClient注解描述的接口的名字(首字母小写)
 * contextId,作为远程调用服务的唯一标识
 */
//描述远程调用接口,这个接口不需要写实现类,只需要定义规则即可(请求方式,请求url,请求参数)
@FeignClient(name="sca-provider",
            contextId = "remoteProviderService",
            fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
    //@GetMapping表示以get请求方式调用远端服务
    //"/provider/echo/{msg}"为远程调用服务的url
    @GetMapping("/provider/echo/{msg}")
    String echoMsg(@PathVariable("msg") String msg);
}

5.5 创建FeignConsumerController中,注入接口实现类,调用接口方法,实现服务调用

5.6 调用的服务突然不可用了或者调用过程超时,通过断融返回提示信息

5.6.1 定义FallbackFactory接口的实现

/**
 * 基于此对象处理RemoteProviderService接口调用时出现的服务中断,超时等问题
 */
@Component
public class ProviderFallbackFactory
        implements FallbackFactory<RemoteProviderService> {
    /**
     * 此方法会在RemoteProviderService接口服务调用时,出现了异常后执行.
     * @param throwable 用于接收异常
     */
    @Override
    public RemoteProviderService create(Throwable throwable) {
        return (msg)->{
                return "服务维护中,稍等片刻再访问";
        };
    }
}

5.6.2 在Feign访问接口中应用FallbackFactory对象

5.6.3 配置文件application.yml,启动feign方式调用时的服务中断处理机制

feign:  
  hystrix:
    enabled: true #默认值为false

5.7 服务端添加Thread.sleep(50000)测试中断

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值