构建第二个微服务 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
两个服务都已经进行了注册
下面是重点, 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 成功