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


    @GetMapping("/{id}")

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

        return userService.queryById(id);

    }




    public User queryById(Long id) {

        return userMapper.findById(id);

    }



思路:要想查询订单的信息返回的数据需要有用户信息,那只需要在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();

    }

}



接着在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;

    }



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


{

  "id": 101,

  "price": 699900,

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

  "num": 1,

  "userId": 1,

  "user": {

    "id": 1,

    "username": "张三",

    "address": "广东湛江"

  }

}




三、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>



(2)配置Eureka相关信息


spring:

  application:

    name: eurkaserber #服务名称

eureka:

  client:

    service-url:  #eureka地址信息

      defaultZone: http://127.0.0.1:10086/eureka



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


//eureka自动装配开关

@EnableEurekaServer

@SpringBootApplication

public class EurekaAplication {

    public static void main(String[] args) {

        SpringApplication.run(EurekaAplication.class, args);

    }

}



(4)注册服务

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

    
    <!--eureka客户端-->
    
    <dependency>
    
    	<groupId>org.springframework.cloud</groupId>
    
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    
    </dependency>
    
    
    
    
  • 在要注册的服务填写有关Ereka配置信息

    
    spring:
    
      application:
    
        name: userservice #userservice的服务名称
    
    eureka:
    
      client:
    
        service-url:  #eureka地址信息
    
          defaultZone: http://127.0.0.1:10086/eureka
    
    
    
    
  • 在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();
    
        }
    
    
    
    }
    
    
    
    
  • 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地址,不需要将端口号写死了,只需要写服务名称即可



public Order queryOrderById(Long orderId) {

    // 1.查询订单

笔者福利

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值