SpringCloud 消费者和提供者
sprincloud是基于微服务架构思想的框架,它提供了多种组件来解决微服务带来的的一些列问题,因此可以把它看做是一个生态,在微服务架构中,每一个微服务都是一个小的项目,服务之间必然存在接口调用,通常把接口提供方
称为为提供者,接口调用方称为消费者。
1.创建一个微服务提供者
对应代码如下
@RestController
public class DeptController {
@Autowired
DeptService deptService;
@Autowired
DiscoveryClient discoveryClient;
@RequestMapping("/dept/add")
public boolean addDept(Dept dept) {
return deptService.addDept(dept);
}
@RequestMapping("/dept/get/{id}")
public Dept queryDeptById(@PathVariable("id") int id) {
return deptService.queryDeptById(id);
}
@RequestMapping("/dept/list")
public List<Dept> queryAllDept() {
return deptService.queryAllDept();
}
@RequestMapping("/dept/discovery")
public Object discovery() {
//获取注册的服务列表清单
List<String> services = discoveryClient.getServices();
System.out.println("所有注册的服务为:"+services);
List<ServiceInstance> instances = discoveryClient.getInstances("springcloud-provider-dept");
for (ServiceInstance instance : instances) {
System.out.println(
instance.getHost()+"/t"+
instance.getPort()+"/t"+
instance.getUri()+"/t"+
instance.getServiceId() );
}
return this.discoveryClient;
}
}
@Mapper
@Repository
public interface DeptDao {
public boolean addDept(Dept dept);
public Dept queryDeptById(int id);
public List<Dept> queryAllDept();
}
public interface DeptService {
public boolean addDept(Dept dept);
public Dept queryDeptById(int id);
public List<Dept> queryAllDept();
}
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
DeptDao deptDao;
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
}
public Dept queryDeptById(int id) {
return deptDao.queryDeptById(id);
}
public List<Dept> queryAllDept() {
return deptDao.queryAllDept();
}
}
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class Provider_dept_8001 {
public static void main(String[] args) {
SpringApplication.run(Provider_dept_8001.class,args);
}
}
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huang.dao.DeptDao">
<insert id="addDept" parameterType="Dept">
insert into dept(dname,db_source)
values (#{dname},DATABASE())
</insert>
<select id="queryDeptById" resultType="Dept" parameterType="int">
select * from dept where dno = #{dno}
</select>
<select id="queryAllDept" resultType="Dept" >
select * from dept
</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
application.yml
server:
port: 8081
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.huang.pojo
config-location: classpath:mybatis/mybatis-config.xml
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
username: root
password: 123456
url: jdbc:mysql://192.168.43.155:3306/db01?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
#配置注册中心
eureka:
client:
service-url:
defaultZone: http://eureka7003.com:7003/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
instance:
instance-id: springcloud-provider-dept8001 #修改eureka上的默认描述信息
info:
app.name: testProvider
company.name: testProvider
2.创建一个微服务消费者
代码如下:
@Configuration
public class ConsumerConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
//消费者不应该有service层
@RestController
public class DeptConsumerController {
//提供的访问服务提供者模板类,注册后直接使用
@Autowired
RestTemplate restTemplate;
//服务提供者访问前缀
public static final String URL_PREFIX = "http://localhost:8081";
@RequestMapping("consumer/dept/add")
public boolean addDept(Dept dept) {
return restTemplate.postForObject(URL_PREFIX+"/dept/add",dept,Boolean.class);
}
@RequestMapping("consumer/dept/get/{id}")
public Dept queryDeptById(@PathVariable("id") int id) {
return restTemplate.getForObject(URL_PREFIX+"/dept/get/"+id,Dept.class);
}
@RequestMapping("consumer/dept/list")
public List<Dept> queryAllDept() {
return restTemplate.getForObject(URL_PREFIX+"/dept/list",List.class);
}
}
@SpringBootApplication
public class Consumer_dept_80 {
public static void main(String[] args) {
SpringApplication.run(Consumer_dept_80.class,args);
}
}
3.访问http://localhost/consumer/dept/list测试(不经过注册中心)
父项目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>
<groupId>com.huang</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud-api</module>
<module>springcloud-provider-dept-8001</module>
<module>springcloud-consumer-dept-80</module>
<module>springcloud-eureka-7001</module>
<module>spring-cloud-eureka-7002</module>
<module>spring-cloud-eureka-7003</module>
</modules>
<!--打包方式-->
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!--springcloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<!--日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
提供者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">
<parent>
<artifactId>spring-cloud</artifactId>
<groupId>com.huang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-dept-8001</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.huang</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
</project>
消费者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">
<parent>
<artifactId>spring-cloud</artifactId>
<groupId>com.huang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-dept-80</artifactId>
<dependencies>
<dependency>
<groupId>com.huang</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>