一. 先要一个服务的管理平台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(name="sca-provider",
contextId = "remoteProviderService",
fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
@GetMapping("/provider/echo/{msg}")
String echoMsg(@PathVariable("msg") String msg);
}
5.5 创建FeignConsumerController中,注入接口实现类,调用接口方法,实现服务调用
5.6 调用的服务突然不可用了或者调用过程超时,通过断融返回提示信息
5.6.1 定义FallbackFactory接口的实现
@Component
public class ProviderFallbackFactory
implements FallbackFactory<RemoteProviderService> {
@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)测试中断
|