文章目录
说明:
本案例是依靠狂神说springcloud讲解完成,对于添加部门接口在测试的时候,使用了post请求,添加未成功,其他功能没有问题。
http://localhost/consumer/dept/add?dname=%27aa%27
问题描述:在生产者方,添加接口没有问题,在消费者使用RestTemplate调用postForObject的方法,报错如下,eureka集群添加部门名称功能有问题,解决方案正在处理中。
springcloud-api的搭建
- 主要是封装实体类,添加mysql-connector-java的依赖。
- 导入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
- java实体类
package cn.itcast.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 类描述:
*
* @ClassName Dept
* @Description TODO
* @Author GZ
* @Date 2021/10/20 22:23
* @Version 1.0
*/
@Accessors
@NoArgsConstructor
@Data
public class Dept implements Serializable {
private long deptno;
private String dname;
private String DB_source;
public Dept(String dname) {
this.dname = dname;
}
}
springcloud-consumer-dept-80消费者的搭建
- 消费者中配备了Eurka的服务注册中心 和 Ribbon 的负载均衡
application.yaml
server:
port: 80
eureka:
client:
register-with-eureka: true #表示是否将自己注册进Eureka默认为true
fetch-registry: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
service-url:
defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/,http://localhost03:7003/eureka/
spring:
application:
name: consumer
RestTemplateConfig
package cn.itcast.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* 类描述:
*
* @ClassName RestTemplateConfig
* @Description TODO
* @Author GZ
* @Date 2021/10/21 2:01
* @Version 1.0
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced //Ribbon的负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
ConsumerDept
package cn.itcast.controller;
import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* 类描述:
*
* @ClassName ConsumerDept
* @Description TODO
* @Author GZ
* @Date 2021/10/21 1:40
* @Version 1.0
*/
@RestController
public class ConsumerDept {
// private static final String PROVIDERDEPT = "http://localhost:8001";
private static final String PROVIDERDEPT ="http://SPRINGCLOUD-PROVIDER-DEPT";
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/dept/all")
public List<Dept> findAllDept() {
return restTemplate.getForObject(PROVIDERDEPT+"dept/all", List.class);
}
//测试有问题,可删除
@RequestMapping("/consumer/dept/add")
public boolean add( @RequestBody Dept dept) {
return restTemplate.postForObject(PROVIDERDEPT+"dept/add", dept, Boolean.class);
}
@GetMapping("/consumer/dept/get/{deptno}")
public Dept findById(@PathVariable("deptno") long deptno) {
return restTemplate.getForObject(PROVIDERDEPT+"/dept/get/"+deptno, Dept.class);
}
}
Consumer
package cn.itcast;
import cn.itcast.config.RestTemplateConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
/**
* 类描述:
*
* @ClassName Consumer
* @Description TODO
* @Author GZ
* @Date 2021/10/21 2:05
* @Version 1.0
*/
@SpringBootApplication
@EnableEurekaClient
//@RibbonClient(name = &