student项目发现teacher项目,并调用方法。
2019-05-10 本文已影响0人
寂静的春天1988
启动类
package com.ganlong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class SpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
controller类
package com.ganlong.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ganlong.model.meta.StudentDO;
import com.ganlong.service.StudentService;
@RestController
public class StudentController {
@Autowired
StudentService studentService;
@GetMapping("/queryStudentById")
public StudentDO queryStudentById() {
return studentService.queryStudentById(1L);
}
}
DO类
package com.ganlong.model.meta;
public class StudentDO {
private Long id;
private String stuName;
private Long teacherId;
private TeacherDO teacherDO;
public StudentDO() {
super();
}
public StudentDO(Long id, String stuName, Long teacherId) {
super();
this.id = id;
this.stuName = stuName;
this.teacherId = teacherId;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Long getTeacherId() {
return teacherId;
}
public void setTeacherId(Long teacherId) {
this.teacherId = teacherId;
}
public TeacherDO getTeacherDO() {
return teacherDO;
}
public void setTeacherDO(TeacherDO teacherDO) {
this.teacherDO = teacherDO;
}
}
serviceImpl类
package com.ganlong.service.imp;
import java.util.HashMap;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.ganlong.model.meta.StudentDO;
import com.ganlong.model.meta.TeacherDO;
import com.ganlong.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
static HashMap<Long, StudentDO> stuMap;
static {
stuMap=new HashMap<Long, StudentDO>();
StudentDO stu1=new StudentDO(1L, "1", 1L);
stuMap.put(stu1.getId(), stu1);
}
@Override
public StudentDO queryStudentById(Long id) {
stuMap.get(id);
TeacherDO t1=queryTeacher(stuMap.get(id).getTeacherId());
stuMap.get(id).setTeacherDO(t1);
return stuMap.get(id);
}
/**
* 调用teacher项目的根据id查询的服务
*/
public TeacherDO queryTeacher(Long id) {
//通过服务id查询服务实例,服务id就是服务名,可能有多个服务所以返回的是List
String serviceId="teacher";
List<ServiceInstance> serviceInstances=discoveryClient.getInstances(serviceId);
if(serviceInstances.isEmpty()) {
return null;
}
//这里是demo,所以直接取第一个
ServiceInstance serviceInstance=serviceInstances.get(0);
String url=serviceInstance.getHost()+":"+serviceInstance.getPort();
System.out.println("url1:"+url);
System.out.println("url2:"+serviceInstance.getUri());
//访问teacher项目的controller类
TeacherDO teacher=restTemplate.getForObject("http://"+url+"/queryTeacherId?id="+id, TeacherDO.class);
return teacher;
}
}
yml文件
server:
port: 8082
spring:
application:
name: student #指定服务名称
eureka:
client:
register-with-eureka: false #是否将自己注册到eureka,默认为true,因为这里只做为消费者,所以为false
fetch-registry: true #是否从eureka中获得注册信息,默认为true。这里需要获取teacher项目的信息,所以为true
service-url: #eureka客户端和服务端交互的地址
defaultZone: http://127.0.0.1:8080/eureka/
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ganlong</groupId>
<artifactId>spring_cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring_cloud</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.ganlong</groupId>
<artifactId>spring_cloud_teacher</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<exclusions>
<!-- 排除返回格式为xml的依赖 -->
<exclusion>
<artifactId>jackson-dataformat-xml</artifactId>
<groupId>com.fasterxml.jackson.dataformat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
pom文件添加了
<!-- 排除返回格式为xml的依赖 -->
<exclusion>
<artifactId>jackson-dataformat-xml</artifactId>
<groupId>com.fasterxml.jackson.dataformat</groupId>
</exclusion>
遇到了第一个坑:发现不添加以上代码,返回的是xml格式的数据。
因为添加的eureka服务默认配置是返回xml格式,这里需要排除该依赖,这样返回的格式就是json格式了。