springcloud学习笔记

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud学习笔记相关的知识,希望对你有一定的参考价值。

微服务是什么?

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底
地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,
从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动
或销毁,拥有自己独立的数据库。

SpringBoot和SpringCloud的关系与区别

1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。

2、SpringCloud是一系列框架的集合,可以包含SpringBoot。

SpringBoot是微服务框架吗?

1、SpringBoot只是一个快速开发框架,算不上微服务框架。

2、SpringCloud+SpringBoot 实现微服务开发。具体的来说是,SpringCloud具备微服务开发的核心技术:RPC远程调用技术;SpringBoot的web组件默认集成了SpringMVC,可以实现HTTP+JSON的轻量级传输,编写微服务接口,所以SpringCloud依赖SpringBoot框架实现微服务开发。

参考博客:
https://blog.csdn.net/weixin_42315600/article/details/84134094

微服务特点

1)拆分
2)各自独立的进程
3)拥有自己独立的数据库

微服务的优缺点

优点
每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求
开发简单、开发效率提高,一个服务可能就是专一的只干一件事。
微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
微服务能使用不同的语言开发。
易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, Hudson, bamboo 。
微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
微服务允许你利用融合最新技术。
微服务只是业务逻辑的代码,不会和html,CSS 或其他界面组件混合。
每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。

缺点
开发人员要处理分布式系统的复杂性
多服务运维难度,随着服务的增加,运维的压力也在增大
系统部署依赖
服务间通信成本
数据一致性
系统集成测试
性能监控……

微服务案例构建过程需要注意的地方

消费者模块可以使用RestTemplate进行远程访问。
RestTemplate提供了多种便捷访问远程Http服务的方法,
是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
RestTemplate访问restful接口接口非常简单

示例:
消费者

@RestController
public class DeptController_Consumer

    private static final String REST_URL_PREFIX = "http://localhost:8001";
    
    @Autowired
    private RestTemplate restTemplate;
       
    @RequestMapping(value="/consumer/dept/get/id")
    public Dept get(@PathVariable("id") Long id)
    
         return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
    
    
    @SuppressWarnings("unchecked")
    @RequestMapping(value="/consumer/dept/list")
    public List<Dept> list()
    
         return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
       

Eureka服务注册与发现


Eureka包含两个组件:Eureka Server 和 Eureka Client
各个节点启动后,会在Eureka Server注册
Eureka Client:简化Eureka Server交互

Netflix在设计Eureka时遵守的就是AP原则
Eureka相当于注册中心

注册中心eureka Server的构建
1)核心pom配置:

<dependencies>
   <!--eureka-server服务端 -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka-server</artifactId>
   </dependency>
  </dependencies>
  1. 核心yml配置:
 
server: 
  port: 7001
 
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://$eureka.instance.hostname:$server.port/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

3)主启动类加上服务端的注解@EnableEurekaServer,
接收其他微服务注册进来

服务提供者Provider的构建
Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
1)核心pom配置:

   <!-- 将微服务provider侧注册进eureka -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

2)核心yml配置:

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://localhost:7001/eureka

3)主启动类加上客户端的注解@EnableEurekaClient ,
服务启动后自动注册到eureka服务中


4)当客户端启动完成后,再次打开服务端的时候,将会发现已经注册进去的客户端
上面注册进去的MS-DEPT就是,客户端配置的spring.application.name


5)修改入驻服务的id

prefer-ip-address: true配置这一行,就会显示ip

actuator与注册微服务信息完善
1).微服务info内容详细信息
在provider的pom下增加:

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

2)在父工程的pom下增加:
作用:在src/main/resources路径下,用maven-resources-plugin解析带用$的字段

<build>
   <finalName>microservicecloud</finalName>
   <resources>
     <resource>
       <directory>src/main/resources</directory>
       <filtering>true</filtering>
     </resource>
   </resources>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <configuration>
         <delimiters>
          <delimit>$</delimit>
         </delimiters>
       </configuration>
     </plugin>
   </plugins>
  </build>

在provider工程的yml下增加:
这是用于解析info的内容

info:
  app.name: atguigu-microservicecloud
  company.name: www.atguigu.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$
 

3)点击提供者的超链接,显示详情信息

eureka自我保护
某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存

禁用自我保护:
eureka.server.enable-self-preservation=false

provider服务发现Discovery示例

服务发现:可以对外暴露自身,从注册中心拿到相对应的服务
1).provider项目中的Controller层

@RestController
public class DeptController

  @Autowired
  private DeptService service;
  @Autowired
  private DiscoveryClient client;

  @RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
  public Object discovery()
  
    List<String> list = client.getServices();
    System.out.println("**********" + list);


    List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
    for (ServiceInstance element : srvList) 
     System.out.println(element.getServiceId() + "\\t" + element.getHost() + "\\t" + element.getPort() + "\\t"
         + element.getUri());
    
    return this.client;
  



2).provider主启动类添加@EnableDiscoveryClient

3).consumer模块controller层调用

  //测试@EnableDiscoveryClient,消费端可以调用服务发现
  @RequestMapping(value="/consumer/dept/discovery") 
  public Object discovery()
  
   return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
   

服务消费者Consumer的构建
Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务

Eureka集群配置
1).修改映射配置
示例:
找到C:\\Windows\\System32\\drivers\\etc路径下的hosts文件
2).服务端7001下的yml集群配置

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      


客户端8001的集群配置修改

3)集群环境,7001上面挂着7002和7003

4).作为服务注册中心,Eureka比Zookeeper好在哪里
Zookeeper保证的是CP,
Eureka则是AP。
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

因为是集群是分布在多台机器上,所以P一定要满足,
对于双11这种,选择A保证网站不能瘫痪

Ribbon负载均衡

Ribbon实现了一套客户端的 负载均衡的工具。

1)Ribbon的初步配置
消费者的pom.xml

<dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-ribbon</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>

修改消费者的yml

以及相对的controller的url修改

需要在restTemplate加上负载均衡的注解

消费者需要和eureka整合,加入EnableEurekaClient注解

2)Ribbon负载均衡算法

用我们重新选择的随机算法替代轮询算法
RetryRule:默认轮询,突然宕一个服务8001,8001会返回page 页面,撞了几次之后,将不会去找8001了


用我们自己的ribbin算法

自定义配置类,不能放在@ComponentScan注解所扫描的当前包以及子包下面,也就是不能和主启动类同包或者子包,因为@SpringBootApplication里面包含@ComponentScan

Feign负载均衡算法(也是客户端)

之前ribbin是根据服务名来进行访问,
而feign是通过接口+注解

feign集成了Ribbin,也可以用之前的负载均衡算法
前面是Ribbin+RestTemplate,是模板化的调用方法;
而Feign是声明式的Web服务客户端,只需要加上注解即可

1)Feign工程的配置
pom.xml

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

2)新建接口

增加FeignClient注解

调用:

主启动类增加EnableEurekaClient注解

* Hystrix断路器 *

专门用来处理分布式的延迟和容错的开源库,
保证一个依赖出问题的情况下,不会导致整体的服务失败,避免级联故障,提高分布式系统的弹性。
向消费者抛出一个可处理的备选响应,而不是长时间的等待或者抛出异常。

服务熔断(提供端produce的熔断)
熔断机制是应对雪崩效应的一种微服务链路保护机制
缺点:
会导致方法膨胀;同时方法和业务绑定一样,高度耦合

服务熔断配置
1)pom.xml

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

2)修改对应的id

3)增加HystrixCommand注解,fallbackMethod表示当抛出异常时候,调用的方法名称

服务降级

1)新建一个类DeptClientServiceFallbackFactory,实现FallbackFactory

2)添加注解服务异常注解

3)消费者增加yml配置:

服务熔断和服务降解
服务熔断:熔断是对某个服务熔断和服务异常进行处理

服务降解:降级是要关闭某个服务减少服务器的压力;
避免方法膨胀;解耦;

zuul路由网关

过滤、保护的作用

1)添加网关的注解EnableZuulProxy

2)在网关进行yml配置,对真实的微服务名称进行隐藏

ignored-services: “*” 忽略多个的微服务名称

SpringCloud Config

为了统一管理配置文件


1)配置git项目的yml

2)主启动类增加EnableConfigServer注解

以上是关于springcloud学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

什么是SpringCloud?

老年人都能看懂的SpringCloud,错过了血亏!

springcloud学习笔记

springcloud学习笔记

springcloud学习笔记

SpringCloud学习笔记1:什么是SpringCloud