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

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

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

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

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

如图:

 

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

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

@RestController
@RequestMapping("/product")
public class ServerController {

    @Autowired
    ProductService 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 {
//
    @Autowired
    LoadBalancerClient loadBalancerClient;
    @GetMapping("/getProductMsg")
    public String getProductMsg(){
        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
        String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort())+"/sell/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
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

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

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

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

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

发布了41 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37992974/article/details/91401159