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格式了。

上一篇 下一篇

猜你喜欢

热点阅读