• SpringCloud(一)--Eurea


    视频学习指路–黑马程序员微服务技术栈
    【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

    服务拆分

    拆分的注意事项:
    1.不同的微服务,不要重复开发相同的业务
    2.微服务的数据库之间独立,不要访问其他微服务的数据库
    3.微服务可以将自己的业务暴露为借口,供其他微服务调用
    在这里插入图片描述
    如图所示的远程调用:订单模块和用户模块各自拥有属于自己的数据库,各自模块独立,现在使得订单模块可以类似于浏览器的地址栏一样通过url的方式访问用户模块,来获得用户模块的信息,从而拼接成自己需要的信息。

    微服务远程调用

    RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更为优雅的调用RESTFul服务的方式。RestTemplate简介原文连接
    基于RestTemplate发起的http请求实现远程调用,http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
    1.注册RestTemplate
    (bean的注入应该放置到配置类当中,@Configuration和@SpringBootApplication所在的类都属于配置类)

    package com.titi.order;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @MapperScan("com.titi.order.mapper")
    @SpringBootApplication
    
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    
        /**
         * 创建RestTemplate并注入Spring容器
         * @return
         */
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    2.修改order-service中的OrderService的queryOrderById方法

    package com.titi.order.service;
    
    import com.titi.order.mapper.OrderMapper;
    import com.titi.order.pojo.Order;
    import com.titi.order.pojo.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        @Autowired
        private RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            //2.利用RestTemplate发起http请求,查询用户
            //2.1 url路径
            String url="http://localhost:8081/user/"+order.getUserId();
            //2.2 发送http请求,实现远程调用
            User user = restTemplate.getForObject(url, User.class);
            // 4.返回
            order.setUser(user);
            return order;
        }
    }
    
    
    • 提供者与服务者
      服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
      服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
      提供者和消费者角色其实是相对的,一个服务既可以是提供者也可以是消费者。

    Eureka

    Eureka注册中心

     在这里插入图片描述

    • eureka的作用:
    • 消费者该如何获取服务提供者具体的信息?
      1、服务提供者启动时向eureka注册自己的信息
      2、eureka保存这些信息
      3、消费者根据服务名称向eureka拉取提供者信息
    • 如果有多个服务提供者,消费者该如何选择?
      服务消费者利用负载均衡算法,从服务列表中挑选一个
    • 消费者如何感知服务提供者的健康状态?
      1、服务提供者会每隔30s向EurekaServer发送心跳请求,报告健康状态
      2、eureka会更新记录服务列表信息,心跳不正常会被剔除
      3、消费者就可以拉取到最新的信息

    搭建EurekaServer服务

    Eureka 服务注册

    eureka注册中心的搭建
    1、创建项目,引入依赖

            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
            dependency>
    

    2、编写启动类,添加@EnableEurekaServer注解

    package com.titi.eureka;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class,args);
        }
    }
    

    3、添加application.yml文件,编写配置

    server:
      port: 10086 #服务端口
    spring:
      application:
        name: eurekaserver #eureka的服务名称
    eureka:
      client:
        service-url: #eureka的地址信息
          defaultZone:http://127.0.0.1:10086/eureka
    

    注意:在访问页面的时候,直接输入http://ip地址:端口号即可,不要输入成http://ip地址:端口号/eureka,否则页面显示不出来(卡了一下午,我。。。。。。)

    eureka-client端的搭建:user-service
    1、在对应模块添加依赖

     <!--eureka客户端的依赖-->
            
                org.springframework.cloud
                spring-cloud-starter-netflix-eureka-client
            
    

    2、user-service的application.yml中添加配置

    spring:
        application:
            name: userservice #user服务的服务名称
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:10086/eureka 
    

    eureka-client端的搭建:order-service同理
    在这里插入图片描述

    另外,可以将user-service多次启动,模拟多实例部署,但是我了避免端口冲突,需要修改端口设置
    在这里插入图片描述

    Eureka服务发现

    服务拉取是基于服务名称拉取服务列表,然后在对服务列表做负载均衡
    1、修改OrderService的代码,将带有ip地址和主机号的url修改成服务名称
    在这里插入图片描述2、在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注释

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class,args);
        }
    }
    

    Ribbon负载均衡

    1、负载均衡流程
    在这里插入图片描述在这里插入图片描述

    2、负载均衡规则的修改
    通过定义IRule可以实现修改负载均衡规则,有两种方式
    1、代码方式:在order-service中的OrderApplication类中定义一个新的IRule。这种方式是全局型的。

     @Bean
        public IRule randomRule(){
            return new RandomRule();
        }
    

    2、配置文件的方式:在order-service的application.yml文件中,添加新的配置也可以修改规则。这种方式是局部的,可以指定服务的名称(指定哪一个微服务采取这种负载均衡策略

    userservice:
        ribbon:
          NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  #负载均衡规则
    

    饥饿加载:Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载会在项目启动的时候创建,降低第一次访问的耗时,通过配置开启饥饿加载。
    在orderservice的配置文件中指定:

    ribbon:
      eager-load:
        enabled: true #开启饥饿加载
        clients: #指定饥饿加载的服务名称
          - userservice
    
  • 相关阅读:
    NPM相关
    Docker的3主3从redis集群配置(扩容和缩容配置)
    @Redis高级(数据删除淘汰策略,主从复制,哨兵模式,集群,缓存预热,雪崩,击穿,穿透)
    (五)Spring之Bean的作用域
    项目整个管理论文之2
    springboot整合xxl-job分布式定时任务【图文完整版】
    Mysql高级查询整理
    堡垒机部署
    python实现炫酷的屏幕保护程序
    Android 系统启动 <System server> 服务 [3]
  • 原文地址:https://blog.csdn.net/Apikaqiu/article/details/126937014