SpringCloud

SpringCloud
远程调用协议
SpringCloud底层使用Http协议,慢,通用
Dubbo使用RPC协议,效率快,不通用

SpringCloud底层使用HttpClient进行远程调用,SpringFramework提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与Json的序列化和反序列化,非常的方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持:

  1. HttpClient
  2. OkHttp
  3. JDK原生的URLConnection(默认的)

//需要导HttpClient和JackSon的maven
public class HttpClientDemo {
//创建HttpClient对象
private CloseableHttpClient client = HttpClients.createDefault();
/**
* 把响应内容转换为JavaBean对象
* @throws IOException
* @throws ClientProtocolException
*/
@Test
public void testJson() throws ClientProtocolException, IOException {
String url = “http://127.0.0.1:8080/user/1”;
HttpGet request = new HttpGet(url);

	String result = client.execute(request,new BasicResponseHandler());
	System.out.println("转换前:"+result);
	
	ObjectMapper mapper = new ObjectMapper();
	User user = mapper.readValue(result, User.class);
	
	System.out.println("转换后:"+user);
}

}

RestTemplate
需要引入spring-web的maven
public class RestTemplateDome{
private RestTemplate restTemplate =new RestTemplate ();
@Test
public void test(){
String url = “http://127.0.0.1:8080/user/1”;
User user = restTemplate.getForObject(url,User.class);
System.out.println(user);
}
}

微服务的好处:
1.对业务进行拆分,方便发布项目;
2.更高的版本发布频率;
3.易于重构,服务的设计风格就能够保持一致
4.只要主要的服务没挂,其他服务挂掉也不受影响

SpringBoot和SpringCloud的区别:
1.SpringBoot专注于做一个服务,SpringCloud做分布式,协调多个服务之间的关系;
2.SpringCloud必须要依赖SpringBoot才能搭建
3.SpringBoot和SpringCloud要严格使用相对应的版本

SpringCloud和Dubbo的区别:
1.定位:Dubbo的定位始终是一款RPC框架,而Spring Cloud的目的是微服务架构下的一站式解决方案
2.Spring Cloud是调用的是Http协议,Dubbo调用支持多种协议

SpringCloud五大核心组件:
在这里插入图片描述

1.Eureka(发现)
作用:是Netflix开源的服务注册组件,做一个微服务架构的搭建
在这里插入图片描述底层使用ConcurrentHashMap
库存服务,仓储服务,积分服务
每一个服务都有一个Eureka Client组件,这个专门服务的信息注册到Eureka Server中,告诉Eureka Server自己在那台机器上,监听那个端口,而Eureka Serve 是一个注册中心,里面有一个注册表,保存了各个服务器的IP和端口,
库存服务的Eureka Client组件去Eureka Server的注册表中拉取到其他服务的IP、端口号缓存到自己的本地,当他要用到哪个服务的时候就发送一个请求过去调用那个服务的接口
查看java的后台进程:cmd里面 jps命令
windows杀死进程:cmd里面 taskkill /pid [id值] /f
Eureka配置:
服务方:
服务下线:当生产者服务进行正常关闭操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉服务注册中心
失效剔除:服务可能由于内存溢出或者网络故障等原因时的服务不能正常的工作,而服务注册中心未收到“服务下线”的请求。相对于服务提供者的“服务续约”操作,服务注册中心在启动时会创建一个定时任务,默认每隔一段时间(默认为60s)将当前清单中超时(默认90s)没有续约的服务剔除,这个操作被称为失效剔除
自我保护:
1.什么时候会进入自我保护模式?
15分钟内低于85%的有效服务(服务是失效剔除的)就会进入自我保护
2.进入自我保护模式后,有什么效果?
一旦进入保护模式,所有的Eureka的服务都不在剔除啦!!
3.为什么Eureka会有保护模式?
Eureka在15分钟的短时间内发现15%的服务迅速失效,但是服务提供方是可用的,根据Eureka失效剔除,Eureka可能把剩下的85%会继续剔除掉,那么整个系统无法运作。
server:
eviction-interval-timer-in-ms: 20000 #默认60秒,Eureka服务定时扫描失效服务,把失效的服务剔除

注册方:
register-with-eureka:服务提供方必须向Eureka服务器注册,该值必须为true
instance:
prefer-ip-address: true #是否使用ip地址进行注册 ,false:注册本地域名localhost。true:使用网卡的ip地址
ip-address: 127.0.0.1 #该值只有在prefer-ip-address为true的时候才使用,固定指定ip地址

lease-renewal-interval-in-seconds: 30 #服务注册方续约间隔时间(心跳时间),默认30s,可以修改
lease-expiration-duration-in-seconds: 90 #服务注册方失效时间,默认90s,一般是间隔时间的3倍

消费方:
fetch-registry: true #服务方必须向Eureka服务器拉取注册信息,该值必须为true
registry-fetch-interval-seconds: 30 #服务消费方拉取服务间隔时间,默认30s
2.Feign(假装)
**Feign作用:**简化远程调用的代码(封装RestTemplate代码),用来建立连接、构建请求、解析相应的代码,直接就是用注解定义一个 FeignClient接口,然后调用那个接口就可以了
在这里插入图片描述

Feign的底层使用了动态代理:Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址,最后针对这个地址,发起请求、解析响应

在这里插入图片描述

3.Ribbon
作用:解决负载均衡,如果一个服务上面部署了多台机器,Ribbon会帮你在每一次请求的时候选择一台机器,均匀的把请求发送到各个机器.
Ribbon会从 Eureka Client里面获取到对应的服务注册表,也就知道了所有的服务都部署在了那台机器上,在监听哪些端口,使用轮询算法(Round Robin
)从中选择一台机器,,Feigin就会针对这些机器构造并发送请求
Ribbon配置:
在消费方配置:#修改Ribbon负载策略
user-service: #服务ID
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule #默认是轮询,RandomRule 随机策略

在这里插入图片描述

4.Hystrix(豪猪)
Hystrix是一个隔离、熔断以及降级的框架。
Hystrix熔断器可以防止服务架构出现雪崩问题:
服务器雪崩:服务器支持的线程和并发数有限,某一个服务出现故障时,请求一直阻塞,会导致服务器资源耗尽,从而导致其它服务都不可用,这种问题会导致服务器雪崩
Hystix解决雪崩问题的手段主要包括:
线程隔离
服务降级
服务熔断
在这里插入图片描述在这里插入图片描述
Hystrix的线程隔离和服务降级原理:
Hystrix会为每个依赖服务调用分配一个小线程池,如果线程池已满或者请求超时(默认1s)时调用将被立即拒绝,用户的请求将不再直接访问服务,Hystrix会进行降级处理。当用户请求故障时,不会被阻塞、无休止的等待或者系统崩溃,会返回用户一个友好的提示。
使用Hystrix:
1.在消费方导入maven依赖

     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
     </dependency>

2.在启动类上添加注解
@EnableCircuitBreaker //开启熔断
3.需要隔离的方法上进行配置
@RequestMapping(value = “/{id}”, method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = “findByIdFallBack”) //服务器降级
public User findById(@PathVariable(“id”) Integer id) {
//使用RestTemplate+Eureka+Ribbon进行远程调用

    String url = "http://user-service/user/" + id;
    System.out.println("Eureka拉取的地址:"+url);
    User user = restTemplate.getForObject(url, User.class);

    return user;

}
public  User  findByIdFallBack(Integer  id){//返回提示信息
    User  user = new User();
    user.setName("服务器忙,请稍后重试......");
    return  user;
}

Hystrix服务降级超时时间设置:
1.第一种方式:注解方式(局部有用)
@HystrixCommand(fallbackMethod = “findByIdFallBack”,commandProperties = {@HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”, value =“3000” )}) //服务器降级

2.第二种方式:在application.yml中配置(全局有效)
#全局更改Hystrix降级超时时间
hystrix:
  command:
    default:
      execution:
        isloation:
          thread:
            timeoutMilliseconds: 3000
Hystrix熔断:
在这里插入图片描述
Hystrix不断的监测服务的降级,如果服务的降级比例高于50%,它会立马熔断,5秒之内所有请求都不能访问。5秒之后,如果所有请求可以正常访问,则关闭熔断,若有服务还是不能正常访问,则会打开熔断。

5.Zull(网关)
官网:https://github.com/Netflix/zuul
作用:保护后台所有的微服务
微服务网关,这个组件是负责网络路由的!可以做统一的降级、限流、认证授权、安全。如果前端后端移动端调用后台系统,统一走zull网关进入,由zull网关转发请求给对应的服务
在这里插入图片描述

在这里插入图片描述
面试题:请说出Zuul和Nginx的负载均衡的区别,如何选择?
相同点:
负载均衡、转发请求
不同点:
1.定位不同:Nginx用于部署前端网站,zuul网关保护后台微服务。用户请求 --》nginx(前端网站)–》zuul网关–》微服务(后端系统)
2.zuul可以和Eureka结合,实现注册更加灵活,Nginx需要自行修改配置实现地址更改

SpringCloudAlibaba:
Nacos:注册中心,默认继承Ribbon
Ribbon:实现负载均衡,实现:
@LoadBalanced //根据服务名称拿到所有的ip实例缓存到本地,然后ribbon通过负载均衡
private RedisTemplate redisTemplate;

服务熔断降级
Sentinel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值