微服务进阶(四):Spring Cloud netflix概览及架构设计_springcloud 与netflix的关系(1)

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

下面就是使用上述的子框架实现的为服务架构的组架构图:
在上图中,有几个需要说明的地方:

  • ZUUL网关也在注册中心注册,把它也当成一个服务来统一查看。
  • 负载均衡不是一个独立的组件,它运行在网关、服务调用等地方,每当需要访问一个服务的时候,就会通过Ribbon来获得一个该服务的实例去调用。RibbonEureka注册中心获得服务和实例的列表,而不是发送每个请求的时候从注册中心获得。
  • 可以使用RestTemplate来进行服务间调用,也可以配置FeignClient来使用,不管什么方式,只要使用服务注册,就会默认使用Ribbon负载均衡。(RestTemplate需要添加@LoadBalanced
  • 每个服务都可以开启监控功能,开启监控的服务会提供一个servlet接口/hystrix.stream,如果需要监控这个服务的某一个方法的运行统计,就在这个方法上加一个@HystrixCommand的标签。
  • 查看监控信息,就是在Hystrix Dashboard上输入这个服务的监控url: http://serviceIp:port/hystrix.stream,就可以用图表的方式查看运行监控信息。
  • 如果要把所有的服务的监控信息聚合在一起统一查看,就需要使用Turbine来聚合所需要的服务的监控信息。

我们也可以从上图中看出该架构的部署方式:

  • 独立部署一个网关应用
  • 服务注册中心和监控可以配置在一个应用里,也可以是2个应用。
  • 服务注册中心也可以部署多个,通过区域zone来区分,来实现高可用。
  • 每个服务,根据负载和高可用的需要,部署一个或多个实例。

四、Spring Cloud Netflix 组件开发

上面说到,开发基于Spring Cloud Netflix的微服务非常简单,而且一般是和spring boot一起使用,如果想在自己原先的java web应用中使用也可以通过添加相关配置来实践。 有关开发的详细内容,可以参考spring cloud中文社区的这个系列文章,里面详细介绍了每一种组件的开发。这里,就只是来看一下服务注册中和监控模块的开发,还有服务调用的开发,其他的可以直接参考上面的系列文章。

4.1 注册和监控中心的开发

这个非常简单,就下面一个类:

import@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard 
public class ApplicationRegistry {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

这里使用spring boot标签的 @SpringBootApplication 说明当前的应用是一个spring boot应用。这样就可以直接用main函数在IDE里面启动这个应用,也可以打包后用命令行启动。当然也可以把打包的war包用tomcat之类的服务器启动。 使用标签 @EnableEurekaServer ,就能在启动过程中启动Eureka服务注册中心的组件。它会监听一个端口,默认是8761,来接收服务注册。并提供一个web页面,打开以后,可以看到注册的服务。 添加 @EnableHystrixDashboard 就会提供一个监控页面,可以在上面输入要监控的服务的地址,就可以查看启用了Hystrix监控的接口的调用情况。 当然,为了使用上面的组件,需要在mavenPOM文件里添加相应的依赖,比如使用 spring-boot-starter-parent ,依赖 spring-cloud-starter-eureka-serverspring-cloud-starter-hystrix-dashboard 等。

4.2 服务间调用

在网上的各种文档中,对服务间调用,都没有说明的很清楚,所以这里特别说明一下这个如何开发。 有两种方式可以进行服务调用,RestTemplateFeignClient。不管采用何种方式,都是通过REST接口调用服务的http接口,参数和结果默认都是通过jackson序列化和反序列化。因为Spring MVCRestController定义的接口,返回的数据都是通过jackson序列化成json数据。

4.2.1 RestTemplate

使用这种方式,只需要定义一个RestTemplate的Bean,设置成 LoadBalanced 即可:

@Configurationpublic class SomeCloudConfiguration {
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

这样就可以在需要用的地方注入这个bean使用:

public class SomeServiceClass {
    @Autowired
    private RestTemplate restTemplate;
    public String getUserById(Long userId) {
        UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class);
        return results;
    }
}

其中, users 是服务ID,Ribbon会从服务实例列表获得这个服务的一个实例,发送请求,并获得结果。对象 UserDTO 需要序列号,它的反序列号会自动完成。

4.2.2 FeignClient

除了上面的方式,我们还可以用 FeignClient

@FeignClient(value = "users", path = "/users")public interface UserCompositeService {
    @RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    UserDTO getUserById(@PathVariable Long id);
}

只需要使用 @FeignClient 定义一个借口,Spring Cloud Feign会生成一个它的实现,从相应的users服务获取数据。 其中, @FeignClient(value = “users”, path = “/users/getUserDetail”) 里面的value是服务ID,path是这一组接口的path前缀。 在下面的方法定义里,就好像设置Spring MVC的接口一样,对于这个方法,它对应的URL/users/getUserDetail/{id} 。 然后,在使用它的时候,就像注入一个一般的服务一样注入后使用即可:

public class SomeOtherServiceClass {
    @Autowired
    private UserCompositeService userService;
    public void doSomething() {
        // ..... 
        UserDTO results = userService.getUserById(userId);
        // other operation... 
    }
}

五、遇到的问题

由于Spring Cloud说明文档较少,微服务的架构相对来说也比较复杂,在开发的时候,难免会遇到很多问题,有一些是如何更好地使用这套框架去搭建架构,也有一些问题是如何配置。

5.1 请求超时问题

ZUUL网关默认的超时时间非常短,这是为了保证调用服务的时候能够很快的响应。但是,会有一些业务方法运行的时间比较长,特别是在测试服务器。这时候,就需要调整超时时间。这个超时有几个地方:

  • 负载均衡Ribbon,负载均衡有一个超时的设置,包括链接时间和读取时间
  • Hystrix断路器也有一个超时设置,它需要在适当的时候返回,而不是一直等在一个请求上。
    对应的配置如下:
 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 30000
 ribbon:
     ReadTimeout: 30000
     ConnectTimeout: 15000

5.2 服务ID的问题

服务的ID,也就是服务名,可以通过在application.yml或者bootstrap.yml里面设置:

spring:
  application:
      name: users

5.3 管理路径的问题

Spring Boot的应用默认都是开放一些管理的接口,如 /info 、 /health 和metrics监控的接口 /metrics 等。如果使用默认的路径,使用Hystrix监控、服务注册中心的监听服务状态都不会有问题,但是,如果想使用别的路径,例如 /management/info 、 /management/health ,那就牵扯到很多地方,而且,每个版本可能会或多或少的有一些问题,导致你遇到的问题还会不一样。我遇到过的问题有:

5.3.1 注册成功却找不到服务

首先,注册可以成功,在Eureka服务器页面上也可以看到各个服务。但是,当通过网关调用的时候,却总是提示服务找不到。这时候可能就需要在每个服务的application.yml里面进行如下配置:

eureka:
    instance:
        nonSecurePort: ${server.port}
        appname: ${spring.application.name}
        statusPageUrlPath: ${management.context-path}/info
        healthCheckUrlPath: ${management.context-path}/health

简单来说,这就是告诉在注册的时候,同时告诉Eureka服务器,服务的端口是什么,用来监听状态的路径是什么。这是因为由于使用了不同的管理接口路径,而Eureka服务器没有使用相应的路径。 如果一切正常,在Eureka服务器上点击一个注册的服务,应该能打开一个info页面。他可能是空白的,但是,至少Eureka服务器能通过这个知道服务的运行正常。 这个问题也不是在所有的版本都存在,只是在某一些spring cloud的版本存在。

5.3.2 设置了管理路径的Hystrix监控

刚才说了Hystrix监控的路径是 http://serviceIp:port/hystrix.stream ,如果设置了管理接口的路径,那么这个监控路径也会变成http://serviceIp:port/${management.context-path}/hystrix.stream。如果这时候,再想使用Turbine聚合,Turbine就会找不到了,因为它默认使用Eureka服务器上的服务器地址和端口,在后面添加/hystrix.stream。这时候,就需要设置

Turbine:
turbine:


# 最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

“**道路是曲折的,前途是光明的**!”



![](https://img-blog.csdnimg.cn/img_convert/845c8e865f20248cb1b766d48141fdc3.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/6cbc381448a4630ea1006d42728b172e.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

g-gbItkQLI-1715541597888)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值