当前位置:   article > 正文

微服务入门:服务拆分与Eureka(1)

微服务入门:服务拆分与Eureka(1)

    @GetMapping("/{id}")

    public User queryById(@PathVariable("id") Long id) {

        return userService.queryById(id);

    }



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

    public User queryById(Long id) {

        return userMapper.findById(id);

    }



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

思路:要想查询订单的信息返回的数据需要有用户信息,那只需要在service层查询出订单信息之后,再利用订单信息中的用户id,像Axios那样访问user-service层的接口,根据id获取到用户信息,接着返回一个User实体类,订单利用set方法给成员变量中的User赋值即可

首先,现在order-service模块将RestTemplate注入到spring容器中


@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();

    }

}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

接着在service层访问user-service层的接口


    public Order queryOrderById(Long orderId) {

        // 1.查询订单

        Order order = orderMapper.findById(orderId);

        //2.利用RestTemplate查询用户

        String url = "http://loaclhost:8081/user/"+order.getUserId();

        //restTemplate传递一个User.clss过去目的是为了返回不是一个json,而是返回一个实体类

        User user = restTemplate.getForObject(url, User.class);

        //3.封装user信息

        order.setUser(user);

        // 4.返回

        return order;

    }



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

接下来同时运行两个服务,在浏览器上请求order-service的接口,就可以得到一条json数据


{

  "id": 101,

  "price": 699900,

  "name": "Apple 苹果 iPhone 12 ",

  "num": 1,

  "userId": 1,

  "user": {

    "id": 1,

    "username": "张三",

    "address": "广东湛江"

  }

}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

三、Eureka注册中心

===============================================================================

上面服务拆分部分不难看出,在restTemplate调用的url中,url以及耦合死了,这明显也是不利于后期的维护

并且如果有多个相同的服务该如何选择调用?

我们又怎么知道每个服务的健康情况?

因此,这里就需要Eureka注册中心

作用:

  1. 注册服务信息,服务提供者启动时向eureka注册自己的信息
  1. 拉去服务(user-service),根据服务名称向eureka拉取提供者信息
  1. 负载均衡(相同的服务选择哪一个?),从服务列表中挑选一个
  1. 远程调用
  1. 服务提供者每30s会向Eureka发送一次心跳续约,以便Eureka知道服务提供者的健康状况,心跳不正常者会被剔除

在这里插入图片描述

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器


1、Eureka注册中心实现步骤


(1)新建一个模块,导入eureka客户端依赖


<!--eureka客户端-->

<dependency>

	<groupId>org.springframework.cloud</groupId>

	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

</dependency>



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(2)配置Eureka相关信息


spring:

  application:

    name: eurkaserber #服务名称

eureka:

  client:

    service-url:  #eureka地址信息

      defaultZone: http://127.0.0.1:10086/eureka



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(3)打开Eureka自动装配开关


//eureka自动装配开关

@EnableEurekaServer

@SpringBootApplication

public class EurekaAplication {

    public static void main(String[] args) {

        SpringApplication.run(EurekaAplication.class, args);

    }

}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(4)注册服务

  • 先在要注册的服务中引入依赖

    
    <!--eureka客户端-->
    
    <dependency>
    
    	<groupId>org.springframework.cloud</groupId>
    
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    
    </dependency>
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 在要注册的服务填写有关Ereka配置信息

    
    spring:
    
      application:
    
        name: userservice #userservice的服务名称
    
    eureka:
    
      client:
    
        service-url:  #eureka地址信息
    
          defaultZone: http://127.0.0.1:10086/eureka
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 在order-service中添加负载均衡注解

    
    @MapperScan("cn.itcast.order.mapper")
    
    @SpringBootApplication
    
    public class OrderApplication {
    
    
    
        public static void main(String[] args) {
    
            SpringApplication.run(OrderApplication.class, args);
    
        }
    
    
    
        /**
    
         * 完成RestTemplate并注入到spring容器中
    
         * @return
    
         */
    
        //负载均衡
    
        @LoadBalanced
    
        @Bean
    
        public RestTemplate restTemplate(){
    
            return new RestTemplate();
    
        }
    
    
    
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • order-service同上操作,只是服务名称改变

注意的是,千万不要端口号重复了,我这里Eureka的端口号是10086

操作到这里,就可以了,服务以及成功在Ereka中注册了,这时候将三个服务跑起来

用浏览器进入localhost:10086

在这里插入图片描述

可以看到注册的服务和其对应的接口地址

小知识:

如果想多开同一个服务,可以右键该服务,选择复制配置

在这里插入图片描述

然后更换里面的名称和端口号

在这里插入图片描述

    -Dserver.port=8082


      2、运行


      修改order-service中的url地址,不需要将端口号写死了,只需要写服务名称即可

      
          public Order queryOrderById(Long orderId) {
      
              // 1.查询订单
      
      
      ### 笔者福利
      
      ##### 以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
      
      **有了这个,面试踩雷?不存在的!**
      
      ##### 回馈粉丝,诚意满满!!!
      
      ![](https://img-blog.csdnimg.cn/img_convert/4b419492dfafd94121d4992b4333752a.webp?x-oss-process=image/format,png)
      ![](https://img-blog.csdnimg.cn/img_convert/7f219a5362b293adf8f13746e39450a0.webp?x-oss-process=image/format,png)
      ![](https://img-blog.csdnimg.cn/img_convert/4f60c727665d5c00769460590a065561.webp?x-oss-process=image/format,png)
      ![](https://img-blog.csdnimg.cn/img_convert/aea3a5e8cdd60dab8e1957d123db3c34.webp?x-oss-process=image/format,png)
      
      -----------------------------------------------------------
      
      
      
      修改order-service中的url地址,不需要将端口号写死了,只需要写服务名称即可
      
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      public Order queryOrderById(Long orderId) {
      
          // 1.查询订单
      
      • 1
      • 2
      • 3

      笔者福利

      以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

      有了这个,面试踩雷?不存在的!

      回馈粉丝,诚意满满!!!

      [外链图片转存中…(img-LYobmhk8-1714699714678)]
      [外链图片转存中…(img-WfrGF0kp-1714699714679)]
      [外链图片转存中…(img-082biyte-1714699714679)]
      [外链图片转存中…(img-kvnmKQzP-1714699714679)]

      本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

      声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/633902
      推荐阅读
      相关标签
        

      闽ICP备14008679号