spring cloud 入门(三)【Eureka注册中心,微服务之间服务调用方式一(LoadBalancerClient 以及RestTemplate 进行服务调用)】

构建第二个微服务 menu

代码结构如下

MenuApplication 代码如下:
package com.study.menu;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class MenuApplication {

    public static void main(String[] args) {
        SpringApplication.run(MenuApplication.class, args);
    }

}

MenuController

package com.study.menu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 菜单管理
 */
@RestController
public class MenuController {

    @RequestMapping(value = "/getMenu")
    public @ResponseBody
    List<Map<String, Object>>
    getSubNav(HttpServletRequest request, HttpServletResponse response) {
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        Map<String, Object> param = new HashMap<String, Object>(1);
        param.put("system", "系统管理");
        param.put("user", "用户管理");
        param.put("role", "角色管理");
        result.add(param);
        return result;
    }
}

application.properties

server.port=8762

eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
spring.application.name=menu

pom 跟 user 是一样的, 这里就不 copy  了

启动

MenuApplication

再次访问:http://127.0.0.1:8761/

两个服务都已经进行了注册

下面是重点, user 如何调用 menu getMenu 的方法

UserController 代码如下

package com.study.user.controller;

import com.study.user.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("user")
public class UserController {

    private final static Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;
    /**
     * 更新用户信息
     * <p>
     * loadBalancerClient 以及  RestTemplate 远程调用 远程服务
     *
     * @return
     */
    @GetMapping("/getMenu")
    public List<Map<String, Object>> justTest() {
        return userService.getMenu();
    }
}

UserService 代码

package com.study.user.service;


import java.util.List;
import java.util.Map;

public interface UserService {


    List<Map<String, Object>> getMenu();


}

UserServiceImpl 代码如下:

具体实现getMenu 方法如下

package com.study.user.service.impl;

import com.study.user.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private LoadBalancerClient loadBalancerClient;//ribbon负载均衡器

    @Override
    public List<Map<String, Object>> getMenu() {
        //选择调用的服务的名称
        //ServiceInstance 封装了服务的基本信息,如 IP,端口
        ServiceInstance si = this.loadBalancerClient.choose("menu");
        //拼接访问服务的URL
        StringBuffer sb = new StringBuffer();
        //http://localhost:8762/getMenu
        sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/getMenu");
        //springMVC RestTemplate
        RestTemplate rt = new RestTemplate();
        ParameterizedTypeReference<List<Map<String, Object>>> type = new ParameterizedTypeReference<List<Map<String, Object>>>() {
        };
        //ResponseEntity:封装了返回值信息
        ResponseEntity<List<Map<String, Object>>> response = rt.exchange(sb.toString(), HttpMethod.GET, null, type);
        List<Map<String, Object>> list = response.getBody();
        return list;
    }
}

主要代码解释:

ServiceInstance si = this.loadBalancerClient.choose("menu");

//拼接访问服务的URL 其实就是  http://localhost:8762/getMenu

StringBuffer sb = new StringBuffer(); sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/getMenu");

第一个  loadBalancerClient.choose("menu");  这行代码是通过 服务名称 applicationname 来确定

第二个 就是发送http 请求,请求 menu 中 getMenu 的接口 然后返回数据

请求  user 中的 getMenu 接口

user 中 调用menu 成功

猜你喜欢

转载自blog.csdn.net/du_senge/article/details/83786876
今日推荐