室内设计师招聘网站,猎头网站怎么做,上海网站备案网站,盈世企业邮箱登录入口服务注册与发现的概念
服务之间相互访问#xff1a; 例如#xff1a;用户中心与内容中心之间相互调用。
问题#xff1a; 服务调用需要知道对方的服务地址#xff0c;地址写在哪里#xff1f; 如果服务是多个实例部署#xff0c;该调用哪一个#xff1f; 如果服务是多…服务注册与发现的概念
服务之间相互访问 例如用户中心与内容中心之间相互调用。
问题 服务调用需要知道对方的服务地址地址写在哪里 如果服务是多个实例部署该调用哪一个 如果服务是多个实例部署每个实例负载如何分配 解决不用修改代码始终能找到服务的方法 独立的配置文件让所有的服务读取这个配置。
依然存在的问题 随着服务越来越多每个服务部署的实例越来越多哪个上线哪个下线不能靠手工维护。 外部配置文件的问题无法感知服务是不是存活当只有调用时才会发现服务存活与否。
服务注册中心。
原理可以把服务注册与发现类比成一张表。 服务注册与发现的产品 注册中心 使用Java开发的有Nacos、Eureka、Zookeeper。 使用Go语言开发的Consul、CoreDNS。
选择注册与发现的产品
首先我们学习的Java更好的兼容优先选择Java开发的。 其次Nacos作为后起之秀当然要借助前辈的优势所以Nacos能支持的都支持了。 在Spring Cloud体系上Alibaba的产品被称之为第二代微服务的典范是应用的趋势所以我们采用Nacos。 服务注册中心 解决了服务始终能被找到并且能及时发现服务是否存活的问题。 一般集群都会部署很多个微服务节点。这些节点一般都具备两种角色称为“服务的提供者” 和 “服务的消费者”。 “服务提供者”将自己的服务地址等信息登记到“服务注册中心”中调用者“服务消费者”需要的时候每次都先去“服务注册中心”查询即可。既解决了人工维护微服务节点状态的问题也能解决多节点间负载均衡的问题。 服务注册与发现-Nacos
下载Nacos
Redirecting to: https://nacos.io/ 登陆Nacos。 https://localhost:8848/nacos 重要的功能 服务管理。 配置管理。
使用Nacos 新建Spring Boot的web项目。 导入Spring Cloud Alibaba依赖。 各版本之间的对应。 导入Spring Cloud Alibaba依赖。 在dependencyManagement中加入依赖。
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2.2.6.RELEASE/versiontypepom/typescopeimport/scope
/dependency在dependencies中加入Nacos依赖。
编写配置文件 在application.yml中进行如下配置
server:servlet:context-path:/userport:8080
spring:application:name: user-centercloud:nacos:discovery:server-addr: 127.0.0.1:8848
启动项目注册服务在Nacos控制台中存在配置的应用名称说明服务注册成功。
引入nacos后的架构 服务调用
常见的服务间调用方式有二种 RPCRemote Produce Call远程过程调用。 自定义数据格式基于原生TCP通信速度快、效率高但较为复杂。 比如WebService框架CXF阿里的Dubbo。 HTTP基于HTTP协议的服务调用。 跨平台、跨语言但HTTP协议的信息较为臃肿速度较慢。 比如HttpClient等。 基于HTTP的服务调用
JDK提供的HttpUrlConnection。
Apache的HttpClient。
Spring封装的RestTemplate。
Feign NetFlix提供的在RestTemplate和Ribbon基础上封装。
OpenFeign Spring提供的声明式服务调用。 RestTemplate介绍
RestTemplate: 他简化了与HTTP服务的通信方式统一了RESTful的标准封装了http链接。 相较于HttpClient等框架他是一种更优雅的调用方式。 常用方法 getForEntity()、getForObject()。 postForEntity()、postForObject()、postForLocation()。 PUT()、DELETE()等等。 RestTemplate问题
RestTemplate调用的问题 地址是写死的如果地址发生变化怎么办。 如果部署了多个实例为了负载均衡怎么办
借助DiscoveryClient可以通过服务ID来访问也可以按特定算法来访问服务的某个实例。
通过服务名让服务始终能找到
//从注册中心一直只可以找到user-center
listServiceInstanceinstances discoveryclient.getInstances(serviceld:user-center);
//使用是jdk1.8的特性
String targetuRL instances.stream().map(instance -instance.geturi().tostring()/
instance.getServiceId()/users/{id})
.findFirst()//如果有多个实例只取第一个实例
.orElseThrow(()-new IllegalArgumentException(当前没有实例));
log.info(targetURL);
//通过id查询share
Share share shareMapper.selectByPrimaryKey(id);
//通过share的userid查询userDTO
Integer userId share.getUserId();
UserDTO userDTO restTemplate.getForObject(
targetURL,
UserDTO.class,
userId);
使用随机算法随机访问一个实例
//从注册中心一直只可以找到user-center
ListServiceInstanceinstances discoveryclient.getInstances(serviceld:user-center);
//使用是jdk1.8的特性
ListStringtargetuRLS instances.stream()
.map(instance -instance.getUri().tostring()/
instance.getServiceId()/users/{id}).collect(Collectors.tolist());//随机一个实例出来
int i ThreadLocalRandom.current().nextInt(targetURLS.size());String targetuRL targetURLS.get(i);
log.info(targetURL);
负载均衡简析
负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。 以上例子中DiscoveryClient实现了简单的负载均衡
但仍然存在问题 访问服务的代码实现了负载但很繁琐。 在业务逻辑中出现了选择服务实例的代码耦合高。 Ribbon简介
Ribbon是Netflix开源的客户端侧的负载均衡器。他简化服务调用的开发并为我们提供一系列的负载均衡的算法。 Ribbon的使用
添加Nacos依赖因为Nacos依赖了Ribbon所以不需要额外引入默认情况下也不需要加配置。 给RestTemplate开启Ribbon
Bean
LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}
修改服务调用代码
//通过id查询share
Share share shareMapper.selectByPrimaryKey(id);//通过share的userid查询userDTO
Integer userId share.getUserId();
//url直接使用服务名ribbon会给我们自动选择一个实例执行
UserDTo userDTO restTemplate.getForObject(
url:http://user-center/user-center/users/{id},
JserDTO.class,
userId);Ribbon的负载均衡规则 Ribbon的负载均衡配置
#细粒度配置针对某一个服务
user-center: ribbon: NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
为所有微服务配置负载均衡 在ComponentScan外新建全局Ribbon配置类
Configurationpublic class DefaultRibbonconfiguration {Beanpublic IRule ribbonRule(){return new RandomRule();}
所有微服务配置负载均衡 在项目中新增Ribbon配置类
Configuration
RibbonClients(defaultConfiguration DefaultRibbonConfiguration.class)public class RibbonConfiguration {
}
Ribbon的配置项 Ribbon配置属性的方式
clientName.ribbon.xxx 如下属性 NFLoadBalancerClassName: ILoadBalancer实现类。 NFLoadBalancerRuleClassName: Irule实现类。 NFLoadBalancerPingClassName: Iping实现类。 NIWSServerListClassName: ServerList实现类。 NIWSServerListFilterClassName: ServerListFilter实现类
Ribbon懒加载配置
服务重启后第一次访问会比较慢原因是Ribbon默认为所有的微服务开启的是懒加载模式当服务调用到的时候才会去创建对应的请求连接如http://user-center/users/1解决这个问题需要在application.yml中配置如下
ribbon:eager-load;#开启饥饿加载enabled: true#细粒度配置指定服务如果是多个使用逗号分隔clients: user-centerRibbon扩展
在Ribbon的规则中不支持Nacos的权重而Nacos权重在实例的应用中作用很大可根据机器的配置动态调整所承受的请求量所以需要扩展Ribbon的负载均衡策略。 编写代码扩展Ribbon支持Nacos权重继承AbstractLoadBalancerRule编写代码开启配置。
override
public Server choose(Object o){
try {
BaseLoadBalancer loadBalancer (BaseLoadBalancer)this.getLoadBalancer();
//想要请求的微服务名称
String name loadBalancer.getName();
NamingService namingService nacosDiscoveryProperties.namingServiceInstance();
Instance instance namingService.selectoneHealthyInstance(name);
log.info(选择的实例是port{},instance {},instance.getPort(),instance);
return new NacosServer(instance);
}catch(NacosException e){
e.printstackTrace();
return null;Feign
什么是Feign Feign是Netflix开源的声明式HTTP客户端致力于让编写http请求更简单。
RestTemplate与Feign的区别 OpenFeign
什么是OpenFeign OpenFeign是一个显示声明式的WebService客户端。 Spring Cloud对Feign进行了封装使其支持MVC注解和HttpMessageConverts等可以做到使用HTTP请求访问远程服务就像调用本地方法一样的开发者完全感知不到这是在调用远程方法更感知不到在访问HTTP请求。
使用OpenFeign 在启动类上加注解 编写服务调用接口
在Service中注入并调用相关的方法 OpenFeign的组成 OpenFeign的配置
全局配置日志所有的Feign接口生效 属性配置方式支持的配置项
OpenFeign的性能优化
性能优化的方法 把默认的请求方式修改为httpclient或okhttp。 在配置文件中配置连接池(性能提升15%左右)。 配置feign的日志级别建议设置成BASIC。
引依赖 写配置