SpringCloud

1. 概述

springCloud能够为我们解决分布式微服务开发过程问题

springCloud是一个解决微服务开发过程中问题的工具集合

微服务开发

微服务:小的服务

  • 服务:能够具备一定功能接口,项目
  • 服务粒度:服务大小架构师对服务拆分
    • 服务拆分:
      • 业务拆分
      • 模块功能拆分

服务拆分问题:

2. 注册中心

分布式系统基础理论:CAP定理

C:一致性

A:原子性

P:分区容错性

定理:三个中只能同时满足两个,注意P一定存在

        组合中哦只有两种:CP,AP

Nacos是基于CP,Eureka是基于AP

Eureka

Eureka是Netfix公司提供一个关于微服务注册中心解决方案,spring整合到springCloud体系中。

Eureka是基于C/S架构软件

  • C:client(客户端)
  • S:Server(服务器)

1. 引入依赖

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

2. yml配置

server:
  port: 8761
spring:
  application:
    name: eureka-server
# Eureka 专属配置
eureka:
  instance:
    hostname: localhost  # 主机名
  client:
    registerWithEureka: false   # 要不要把自己注册到Eureka  false Eureka单机不要 ,Eureka 集群 true ,默认true
    fetchRegistry: false  # 要不要从Eureka中抓取地址, Eureka自己单机不需要的。 Eureka集群 true,默认true
    serviceUrl:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      defaultZone: http://localhost:8761/eureka/   # 暴露eureka服务地址,后面客户端通过这个地址连接上Eureka服务端。

 3. 访问端口

http://localhost:8761/

4. 启动类

@SpringBootApplication
@EnableEurekaServer  // 开启Eureka服务端
public class EurekaServerApp {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApp.class,args);
    }
}

5. 原理图

Nacos

nacos 阿里巴巴旗下产品,2018年和springcloud共建微服务生态体系,形成spring cloud alibaba,它是一套阿里内部微服务解决方案

1. 依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2. 使用springcloud中特有配置文件:bootstarp.yml 【加载优先级最高】

Consoul

3. 服务调用

Feign

使用feign解决了RestTemplate服务代码冗余且不规范。

Feign也是Netfix产品,但是不支持springmvc中注解,因此springcloud把feign改良形成spring cloud  openfeign

Feign解决服务调用(基于Rest,动态代理)

1. 引入依赖

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

注意:谁调用放在谁的一方,一般放在服务调用方用。

2. 编码

声明一个feign接口:接口中编写的方法,就是调用服务的controller方法的声明

@FeignClient("USER-SERVICE") //被调用方的服务名称
public interface UserFeignClient {

    @GetMapping("user/{id}")
    public User queryById(@PathVariable("id") Long id);

}

3. 业务层

@Service
public class OrderService {

    @Autowired
    private UserFeignClient userFeignClient;

    @Autowired
    private OrderMapper orderMapper;

    public Order getById(Long id){
        Order order = orderMapper.findById(id);
        Long userId = order.getUserId();
        //调用feign,获取user的内容
        User user = userFeignClient.queryById(userId);
        order.setUser(user);
        return order;
    }
}




/被调用方的方法/

//controller
 @GetMapping("/{id}")
   public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

//service
  @Service
  public class UserService {

     @Autowired
     private UserMapper userMapper;

        public User queryById(Long id) {
        return userMapper.findById(id);
    }
}

4. 启动类

@SpringBootApplication
@EnableFeignClients(basePackages = "cn.itcast.order.feign")//feign接口包全路径
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

 总结:feign基于动态代理,基于RestTemplate。

        拦截@FeignClient修饰的接口,取出接口上服务的名称,拼接上方法上映射地址就形成调用地址,在使用RestTemplate发送请求(方法请求映射方式)

dubbo

4. 服务负载均衡组件

Ribbon

1. 引入rabbin依赖

2. 使用注解@LoadBalanced

 @Bean
    @LoadBalanced //负载均衡(服务可能会有多个)
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }

3. 业务层:使用restTemplate调用地址:http://服务名称/地址

@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private OrderMapper orderMapper;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        /**
         *  ribbon提供的负载均衡做
         */

        String url = "http://USER-SERVICE/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
}

4. 启动类加@EnableDiscoveryClient

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    @LoadBalanced //负载均衡(服务可能会有多个)
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }

}

手动开启负载均衡

5. 服务熔断组件

zuul

spring cloud gateway

网关:访问微服务入口或者出口

网关功能:

                1. 路由:
                        静态路由

                        动态路由

                2. 过滤

                        局部过滤:spring cloud gateway 提供好的

                        全局过滤:流量控制,鉴权等

1. 依赖

         <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--nacos服务发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值