springCloud-day01

一:系统架构演变
1.集中式架构:
各种模块都放在一起,并发高,耦合代码
在这里插入图片描述

2…垂直拆分:
解决并发流量分担,不同模块进行优化,系统相互独立重复开发,影响效率
在这里插入图片描述

3.分布式服务:
提高了代码复用,互相之间调用太多关系错综复杂,难以维护
在这里插入图片描述

4.微服务:
相对分布式优势就是有模块之间的管理–eureka注册中心
①:单一职责–就是不同模块不同功能
②:独立–五脏俱全(有各自的功能表现层–业务层–持久层–数据库以及cache)
③:面向服务:提供rest风格服务接口API(基于http协议)
④:自治:
a.团队独立
b.技术独立
c.前后端分离
d.数据库分离
e.部署独立
在这里插入图片描述
二.服务调用方式(远程调用)
1:RPC(dubbo)–只支持java,不能跨语言
2:http(支持各种语言)
①:HttpClient
②:OKHttp
③:URLConnection
④:Spring的RestTemplate(对上面3种进行再次封装可以使用远程调用)

三:SpringCloud(5大核心组件)
1 Eureka:注册中心 --> consul , zookeeper (服务管理)
2.Zuul:服务网关 --> spring cloud gateway
3.Ribbon:负载均衡–>对于集群调用策略
4. Feign:服务调用–>远程调用
5. Hystix:熔断器–>保护机制

四:Eureka(注册中心)
1.基础架构
① Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址。
②. 提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约
③. 消费者:服务调用方,会定期去Eureka拉取服务列表,然后使用负载均衡算法选出一个服务进行调用。
④. 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
在这里插入图片描述
2.编写EurekaServer
①:引依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

②:编写启动类(加注解)

@SpringBootApplication
@EnableEurekaServer // **声明这个应用是一个EurekaServer**
public class EurekaServer {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServer.class, args);
	}
}

③:编写配置

server:
  port: 10086
spring:
  application:
    name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
  client:
    service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要写其它Server的地址。(高可用)
      defaultZone: http://127.0.0.1:10086/eureka #将该IP注册到eureka上的意思
    register-with-eureka: false # 不注册自己
    fetch-registry: false #不拉取服务

启动服务,并访问:http://127.0.0.1:10086
在这里插入图片描述

3.服务注册
①:引入依赖

<!-- Eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

②:在启动类上开启Eureka客户端功能

@SpringBootApplication
@MapperScan("cn.itcast.user.mapper")
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class UserApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserServiceDemoApplication.class, args);
	}
}

③:编写配置

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb01
    username: root
    password: 123
  application:
    name: user-service # 应用名称
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka

在这里插入图片描述
4.服务发现
①:引入依赖

<!-- Eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

②:在启动类开启Eureka客户端

@SpringBootApplication
@EnableDiscoveryClient // 开启Eureka客户端
public class ConsumerApplication {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

③:修改配置

server:
  port: 8080
spring:
  application:
    name: consumer # 应用名称
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka

5.实例:

手动获取erueka中服务名以及下面的实例,进行远程调用代码

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("{id}")
    public User queryById(@PathVariable("id") Long id){
        // 根据服务id(spring.application.name),获取服务实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        // 取出一个服务实例
        ServiceInstance instance = instances.get(0);
        // 从实例中获取host和port,组成url
        String url = String.format("http://%s:%s/user/%s", instance.getHost(), instance.getPort(), id);
        // 查询
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }
}

6.高可用集群:
①:不同服务eurekaSever之间互相注册
在这里插入图片描述
在这里插入图片描述
②:客户端注册服务到集群

eureka:
  client:
    service-url: # EurekaServer地址,多个地址以','隔开
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

注意:理解重要
①.多个Eureka Server之间也会互相注册为服务,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现高可用集群。
因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表信息。(不管拉取那个服务都可以获取所有的注册服务信息)
②:客户端注册服务到集群(防止任何一个Eureka Server挂了,就可以拉取其他没挂的服务)

7.Eureka客户端
①:服务注册
在这里插入图片描述
②:服务续约
在这里插入图片描述
③:获取服务列表
在这里插入图片描述
8.服务下线、失效剔除和自我保护
①:
在这里插入图片描述
②:
在这里插入图片描述
③:
在这里插入图片描述
总结:

  • 服务的注册和发现都是可控制的,可以关闭也可以开启。默认都是开启
  • 注册后需要心跳,心跳周期默认30秒一次,超过90秒没法认为宕机
  • 服务拉取默认30秒拉取一次
  • Eureka每个60秒会剔除标记为宕机的服务
  • Eureka会有自我保护,当心跳失败比例超过阈值,那么开启自我保护,不再剔除服务。
  • Eureka高可用就是多台Eureka互相注册在对方上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值