当前位置: 代码迷 >> 综合 >> springCloud 使用 eureka+RestTemplate 实现服务的注册于发现 RestTemplate的三种使用方式
  详细解决方案

springCloud 使用 eureka+RestTemplate 实现服务的注册于发现 RestTemplate的三种使用方式

热度:49   发布时间:2023-12-03 00:15:00.0

SpringCloud 基础中要实现服务的注册于发现,现在服务的注册有springcloud中的Eureka和阿里系的一套,在服务的发现中我们可以使用 RestTemplate fegin 或者zuul,这里主要介绍了RestTemplate的三种使用方式

主要还是在应用实例中去操作,所有的代码有点多,本文只介绍主要的代码。

1.前提: 使用Eureka 做注册中心,建立productProject 和 orderProject,order服务调用product服务

两个服务都已经使用@EnableDiscoveryClient 进行了服务的注册

如图:

 

2.我们这里使用测试的一个接口:

在product服务里面写一个Controller ,进行测试:

@RestController
@RequestMapping("/product")
public class ServerController {@AutowiredProductService productService;@GetMapping("/msg")public String getMsg(){return "the product Msg1";}
}

由于在一台计算机上进行测试,这里product开放的是8081端口, 且在application.properties文件配置了

server.servlet.context-path=/sell,

这里我们只要访问product服务的 http://localhost:8081/sell/product/msg就可以访问接口了,如图:

3.在order服务里面通过restTemplate进行对product服务的访问,在order服务里面编写Controller,调用product 服务的接口

@RestController
@Slf4j
public class ClientController {@GetMapping("/getProductMsg")public String getProductMsg(){// 第一种方式(直接使用restTemplate进行服务之间的通信,直接使用getForObject url和返回值)RestTemplate restTemplate = new RestTemplate();String response=restTemplate.getForObject("http://localhost:8080/sell/product/msg", String.class);log.info("responseMsg {}",response);return response;}
}

order服务放的是8080端口,且设置了server.servlet.context-path=/sell,所以访问的接口是

http://localhost:8080/sell/getProductMsg

 访问测试:

第一种我们直接调用了getForObject方法,里面两个参数 url 和返回的类型 

        String response=restTemplate.getForObject("http://localhost:8080/sell/product/msg", String.class);
但是这有一个缺陷,就是这里是要指定url中的,在实际的应用中,我们部署是在多太机器上部署product服务的,他们的url肯定是不一样的,这就有缺陷,我们进行第二种改造。

以下是Controller层改造的代码:

@RestController
@Slf4j
public class ClientController {
//@AutowiredLoadBalancerClient loadBalancerClient;@GetMapping("/getProductMsg")public String getProductMsg(){ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort())+"/sell/product/msg";RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url, String.class);log.info("responseMsg {}",response);return response;}

这里引入了localBlanceClient,利用他的choose方法,选择我们要访问的服务,这里是PRODUCT,返回一个ServiceInstance对象,利用这个对象拼接我们的url,关于负载均衡就不用我们管了,这里默认使用的负载均衡策略是轮询。

serviceInstance.getHost(),serviceInstance.getPort() 获取地址和端口,关于测试和第一种测试的方法是一致的。

但是有没有一种方法,我们不需要折磨麻烦,每次获取服务的serverInstance对象,拼接url再进行访问,这样不是多个服务的时候需要写很多重复的代码,当然有就是我们的第三种方法,利用注解的方式,说句实话,自从用了springboot,注解真是太方便了。

第三种:

这里我们先写一个配置类,进行restTemplate的配置

@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}

这里我们将restTemplate交给spring 来进行管理,利用@localBlanced注解,使这个对象拥有自主选择服务的能力

接下来在对我们的Controller进行改造

@RestController
@Slf4j
public class ClientController {
//@AutowiredRestTemplate restTemplate@GetMapping("/getProductMsg")public String getProductMsg(){String response = restTemplate.getForObject("http://PRODUCT/sell/product/msg", String.class);log.info("responseMsg {}",response);return response;}

可以看到url的变化,关于测试也是和上面一样的,我们就不测试了,后边还有fegin的使用以及zuul,关注我,有更多的分享。