对SpringCloud微服务及其相关组件的个人理解

SpringCloud微服务的理解

  1. 微服务用来解决多个模块独立且具有性能瓶颈的问题,通过将程序分成多个服务,可针对服务进行分布式的集群部署,实现系统的高可用
  2. 微服务首先涉及到的就是多个单独服务之间的信息交换,解决的方式就是远程调用,可以通过http访问另一个服务地址的方式去调用, 但是在对存在多个服务提供者的时候,不能确定具体地址,且配置不优雅,于是此时引出来eureka(服务注册中心)
  3. 为了解决多个服务之间互相无法识别等问题,引入注册中心概念,比如Eureka,提供对生产者和消费者的注册和管理工作。通过eureka服务注册中心,消费者可以不用写具体的生产者的地址,只需要配置上实例名称,注册中心会自动并且负载均衡的去分配应该访问的实例地址。此处又引出负载均衡的概念
  4. 负载均衡是为了避免某一个服务过多的提供访问,而其他服务访问量很少不均匀的情况。Ribbon就是很好的一个实现。Ribbon提供多种负载均衡的规则,系统默认的就是轮训访问,即对注册到注册中心的所有服务依次访问,一般不需要修改
  5. 另一个注册中心,也是常用且重要的Nacos,它功能牛逼,提供了服务注册、配置管理、服务管理等功能,完全可以替代Eureka
  6. nacos是一个独立的服务,也是一个jar包,可以直接启动,启动成功后可看到专门的管理页面,在微服务内配置nacos的地址,即可注册成功。
  7. 服务、集群、实例的理解;服务可以理解成微服务内的一个单独的服务,例如提供订单查询的服务,那么服务下面又可以分成多个集群,比如济南机房、北京机房。然后每一个集群内部,又可以分成多个实例,每个实例就是单独启动的微服务的一个小服务,包含订单,支付等多个实例可以理解成,服务依赖集群,集群里面包括了各种各样的实例,每一个实例尽可能的去访问集群内部的实例,不跨集群去访问
  8. nacos可以设置负载均衡规则,同时还能根据权重配置某一个实例访问的比例。
  9. 命名空间环境隔离,namespace,类似于沙盒概念,每一个环境内都是独立的,空间之间不能互相访问。
  10. nacos作为注册中心的功能了解完,继续了解它作为配置管理中心的功能,nacos可以管理微服务内的配置信息,实现在线修改热更新部署。
  11. nacos管理配置并不是说所有的配置信息都需要交给nacos管理,本地可以存在application.yml文件的,nacos可以作为补充,维护常修改的配置信息。配置文件读取的优先级:
    bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
  12. nacos添加的配置信息名字应该是【服务名称】+【开发环境】+【文档后缀】,例如userservice-dev.yaml,如果不包括【开发环境】,那就是全局共享的配置,不论是dev环境还是test环境均可以获取得到。同时需要增加bootstrap.yml来配置服务和nacos的信息,可让服务加载到nacos内的配置信息
  13. 要想实现热部署还需要对nacos在线配置的属性增加一个实体类,并加上@ConfigurationProperties注解方能生效。 或者在标记有@Value的注解属性的类上增加@RefreshScope注解,也可以实现自动刷新
  14. 因为nacos作为注册和配置管理的重点中心,一定需要配置成集群,避免nacos服务宕机引起的整个微服务系统挂掉。
  15. 搭建集群的方式需要使用到web负载均衡器nginx,还需要将nacos的数据库创建成功。将nacos的cluster.conf文件中添加三个nacos地址和端口号(以三个为例), 然后配置刚刚导入的数据库的地址等信息,然后复制三份nacos文件,将application.properties中的端口号修改,启动即可。
    启动成功,再讲nginx服务配置信息中增加三个nacos的地址,进行反向代理,此时nginx对外提供的地址就是nacos的代理地址,在程序中使用nacos地址的时候,就配置nginx的地址即可。
  16. nacos重要的功能完事之后,需要再去了解远程调用,之前使用的远程调用方式还是在具体的访问方法上手写服务地址,这样代码的体验不好,引入重量级Feign的http客户端,可以优雅的解决这个问题。
  17. feign引入之后,可单独创建moudle独立包,将对其他服务引用的feignclient创建在此module下面,然后再被引用的消费者服务上,指定@EnableFeignClients(对应的feignclient类) 然后在feignclient类中可以创建需要的对其他服务controller的http远程调用, 例如:
    @GetMapping(“/user/{id}”) User findById(@PathVariable(“id”) Long id);
    这个类就是对userservice下,user路径下,通过id参数获取用户的接口的远程调用。
    个人理解就是别的服务需要什么接口,就在feignclient中添加对这个接口的远程调用,不用开放所有接口,同时避免了直接引用其他服务jar包,只需要引用feign-module就行了, 而feign-module根据需要引用各种服务的包 feign 也包含了负载均衡,使用的是Ribbon.
  18. 微服务的注册中心、配置中心、远程调用都搞定之后,需要再去了解的是网关。网关就是提供一个统一入口,进行请求路由、权限控制、限流、负载均衡等的操作。
    在zuul和gateway中选择gateway进行了解,性能更好。
  19. 网关也是作为微服务中的一个服务去运行的,需要配置所有需要访问到的服务,并且对每一个服务设置
    唯一id(user-service # 路由id,自定义,只要唯一即可)、
    访问路径(lb://userservice 路由的目标地址 lb就是负载均衡,后面跟服务名称)、
    路由断言(predicates - Path=/user/** 这个是按照路径匹配,只要以/user/开头就符合要求)
    路由过滤器(filters):对请求或响应做处理,可配可不配
    配置成功之后,将原来直接访问服务的地址和端口号改成网关的,也可以访问成功了。
  20. 流程是:用户访问路由地址,根据路由规则判断访问哪个服务,从nacos中拉取相对应的服务列表(多个同一服务的名称在nacos中都是一样的,只是端口号不同),
    然后负载均衡去对应的服务中心去访问并返回数据(此处负载均衡使用的应该还是ribbon?)。
  21. 正常网关的作用就在于此,需要重点了解的是路由断言和过滤器(重重点)
    过滤器分为:当前路由过滤器、默认过滤器(DefaultFilter)、全局过滤器(GlobalFilter)。当前路由过滤器指定到当前路由下,defaultfilter可以指定到所有的服务下,
    Globalfilter则是自定义的过滤器,实现自己的业务逻辑,可以处理一切进入网关的请求和响应,因为是通过实现接口注入spring中,不需要配置文件配置了。
  22. 因为有了网关和路由等,在web访问中容易引起跨域的问题(后台远程调用不会存在跨域),跨域的解决方案就是CORS,
    廖雪峰讲的很好(https://www.ruanyifeng.com/blog/2016/04/cors.html)根据资料,我们需要在网关的配置文件中,配置上允许跨域的信息。
    配置的信息可以包括:允许哪些网站的跨域请求、允许的跨域ajax的请求方式、允许在请求中携带的头信息、是否允许携带cookie等信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值