1.整体的运行环境:

 eclipse 4.6.2 | sts 3.9.3  | jdk 1.8 | tomacat 7.0.75 | springboot 2.0.0 | dubbo 2.5.3 | zkclient 0.1| zookeeper 3.4.10 |

2. Zookeeper 的搭建

关于 Zookeeper 的介绍和搭建,博主写了另外一篇博文,比较简短,详情请看:http://blog.csdn.net/u013142781/article/details/50395650

项目结构

3.1===Api的整体项目代码

pom.xml不需要更改

实体类Emp.java 代码如下:

package com.springboot.dao;
import java.io.Serializable;
public class Emp implements Serializable{  //最重要的是实现这个序列化,不然页面访问会报错
     private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private Integer gender;
	private Integer deptId;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getGender() {
		return gender;
	}
	public void setGender(Integer gender) {
		this.gender = gender;
	}
	public Integer getDeptId() {
		return deptId;
	}
	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}	
}

接口 DemoService.java 代码如下:

package com.springboot.service;
import java.util.List;
import com.springboot.dao.Emp;
public interface DemoService {
	/**
	 * 根据id取emp对象
	 * @param id
	 * @return
	 */
	public Emp  findEmp(int id); 
	/**
	 * 根据id 删除emp对象
	 */
	public void delEmp(int id);
	/**
	 * 根据id修改emp对象的值
	 */
	public void modEmp(Emp emp);
	/**
	 * 添加对象
	 */
	public void addEmp(Emp emp);
	/**
	 * 查找全部对象
	 */
	public List<Emp> findEmps();
}

3.2 ===provider服务提供者

首先是pom.xml文件(最容易出错的是jar包的版本不兼容)

<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.springboot</groupId>
  <artifactId>Provide</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Provide</name>
  <url>http://maven.apache.org</url>

   <!-- springboot parent --> 
    <parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>2.0.0.RELEASE</version> </parent> 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
  </properties>

  <dependencies>
  <!-- 添加api依赖,引进api 从api中pom.xml中复制过来 -->
	<dependency>
	<groupId>com.springboot</groupId>
	  <artifactId>Api-1</artifactId>
	  <version>0.0.1-SNAPSHOT</version>
	</dependency>
	<!-- 添加dubbo依赖,这种方式spring自动下载的是最新版本5.0.4 -->  
    <dependency> 
      <groupId>com.alibaba</groupId>  
      <artifactId>dubbo</artifactId>  
      <version>2.5.3</version>  
      <exclusions> 
        <exclusion> 
          <groupId>org.springframework</groupId>  
          <artifactId>spring</artifactId> 
        </exclusion> 
      </exclusions> 
    </dependency> 
      <!-- 添加zk客户端依赖 (0.4版本不支持) -->   
    <dependency> 
      <groupId>com.github.sgroschupf</groupId>  
      <artifactId>zkclient</artifactId>  
      <version>0.1</version> 
    </dependency> 
     <!-- zookeeper注册中心jar包 -->
      <dependency>  
            <groupId>org.apache.zookeeper</groupId>  
            <artifactId>zookeeper</artifactId>  
            <version>3.4.10</version>
        </dependency> 
        <!-- springboot  jar包 -->
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 链接数据库 连接 jdbc和mysql-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

提供者:mapper.java

package com.springboot.mapper;
import java.util.List;
import com.springboot.dao.Emp;
public interface EmpMapper {	
	//mybatis直接使用注解的方式
	/* @Select("select * from emp where id = #{id}")  
	    Emp selectById(@Param("id")Integer id);  */
	/**
	 * 根据id取emp对象
	 * @param id
	 * @return
	 */
	public Emp  findEmp(int id); 
	/**
	 * 根据id 删除emp对象
	 */
	public void delEmp(int id);
	/**
	 * 根据id修改emp对象的值
	 */
	public void modEmp(Emp emp);
	/**
	 * 添加对象
	 */
	public void addEmp(Emp emp);
	/**
	 * 查找全部对象
	 */
	public List<Emp> findEmps();
}

提供者:DemoServiceImpl.java

package com.springboot.sevice.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springboot.dao.Emp;
import com.springboot.mapper.EmpMapper;
import com.springboot.service.DemoService;
@Service("demoService")   //查找接口
public class DemoServiceImpl implements DemoService{

	@Autowired
	private EmpMapper empMapper;
	/**
	 * 根据id取emp对象
	 */
	@Override
	public Emp findEmp(int id) {
		Emp emp=empMapper.findEmp(id);
		System.out.println(emp.getName());
		return emp;
		
	}
	/**
	 * 根据id 删除emp对象
	 */
	@Override
	public void delEmp(int id) {
		empMapper.delEmp(id);
		System.out.println("删除");
	}
	/**
	 * 根据id修改emp对象的值
	 */
	@Override
	public void modEmp(Emp emp) {
		empMapper.modEmp(emp);
		System.out.println("修改");
		
	}
	/**
	 * 添加对象
	 */
	@Override
	public void addEmp(Emp emp) {
		empMapper.addEmp(emp);
		System.out.println("添加");
	}
	/**
	 * 查找全部对象
	 */
	@Override
	public List<Emp> findEmps() {
		List<Emp>	lists =empMapper.findEmps();
		System.out.println("全查");
		return lists;
	}
}

提供者:启动类App.java(启动类所在位置不要改变,必须包含所有其他包,启动才有效)

package com.springboot;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

@MapperScan("com.springboot.mapper")
@ImportResource(locations={"provide.xml"})
@SpringBootApplication
public class App { 
   /* @Autowired  
    private Environment env;  */
    private static volatile boolean running = true;
	@Bean  
	@ConfigurationProperties(prefix="spring.datasource") 
    public DataSource dataSource() {  
        return new com.alibaba.druid.pool.DruidDataSource();  
    }     
  //提供SqlSeesion  
    @Bean  
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {  
   
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();  
        sqlSessionFactoryBean.setDataSource(dataSource());  
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();  
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/*.xml"));  //最重要的是读取sql语句的xml文件
        return sqlSessionFactoryBean.getObject();  
    } 
    @Bean  
    public PlatformTransactionManager transactionManager() {  
        return new DataSourceTransactionManager(dataSource());  
    }  
    public static void main( String[] args )
    {
    	SpringApplication.run(App.class, args);  
        System.out.println( "服务提供者注册成功" );
    }
    
}

提供者:EmpMapper.xml (sql语句)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.springboot.mapper.EmpMapper" >   //mapper接口所在的类
  <resultMap id="BaseResultMap" type="com.springboot.dao.Emp" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="gender" property="gender" jdbcType="INTEGER" />
    <result column="deptid" property="deptId" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, name, gender, deptid
  </sql>
  <!-- 根据id拿emp对象 -->
  <select id="findEmp" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from emp
    where id = #{id}
  </select>
  <!-- 全查 -->
  <select id="findEmps" resultMap="BaseResultMap">
  	select * from emp 
  </select>
 <!-- 根据id 删除emp对象 -->
 <delete id="delEmp" parameterType="java.lang.Integer">
 delete from emp where id= #{id}
 </delete>
 <!-- 根据id修改emp对象的值 -->
 <update id="modEmp" parameterType="com.springboot.dao.Emp">
 update emp set name=#{name},gender =#{gender},deptid=#{deptId} where id=#{id}
 </update>
 <!-- 添加emp对象 -->
 <insert id="addEmp" parameterType="com.springboot.dao.Emp">
 insert into emp(name,gender,deptId) values(#{name},#{gender},#{deptId})
 </insert>
</mapper>

提供者:application.properties 

spring.datasource.url:jdbc:mysql://localhost:3306/company
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
dubbo.registry.center=127.0.0.1:2181  
server.port=8181

提供者:provide.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
            http://code.alibabatech.com/schema/dubbo
            http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
     <!-- 注解包扫描位置: 因为这里的实现类使用注解的方式 -->
    <context:component-scan base-package="com.springboot.service.*">  
        <context:exclude-filter type="annotation"  
            expression="org.springframework.stereotype.Controller" />  
    </context:component-scan> 
    
  	<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="provider" /> 
   <!-- 这里使用的注册中心是zookeeper -->  
    <dubbo:registry protocol="zookeeper" address="${dubbo.registry.center}" />  
    <dubbo:protocol name="dubbo" port="-1" />  
     <!-- 将该接口暴露到dubbo中 -->   //有多少接口就要暴露多少,不然消费者调用不到
    <dubbo:service interface="com.springboot.service.DemoService" ref="demoService" timeout="300000"></dubbo:service>  
</beans>  

3.3===consume服务消费者

首先是pom.xml 

<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.springboot</groupId>
  <artifactId>Consume-1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Consume-1</name>
  <url>http://maven.apache.org</url>

<!-- springboot parent --> 
    <parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>2.0.0.RELEASE</version> </parent> 
    
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
  </properties>

  <dependencies>
  <!-- 添加api依赖 -->
  <dependency>
  <groupId>com.springboot</groupId>
  <artifactId>Api-1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  </dependency> 
   <!-- 添加dubbo依赖 -->  
    <dependency> 
      <groupId>com.alibaba</groupId>  
      <artifactId>dubbo</artifactId>  
      <version>2.5.3</version>  
      <exclusions> 
        <exclusion> 
          <groupId>org.springframework</groupId>  
          <artifactId>spring</artifactId> 
        </exclusion> 
      </exclusions> 
    </dependency> 
    <!-- 添加zk客户端依赖 -->   
    <dependency> 
      <groupId>com.github.sgroschupf</groupId>  
      <artifactId>zkclient</artifactId>  
      <version>0.1</version> 
    </dependency> 
    <!-- zookeeperjar包 -->
      <dependency>  
            <groupId>org.apache.zookeeper</groupId>  
            <artifactId>zookeeper</artifactId>  
            <version>3.4.10</version>  
              <exclusions>
		       <exclusion>
		       		<groupId>org.slf4j</groupId>
		      		<artifactId>slf4j-log4j12</artifactId>
		      	</exclusion>
		      </exclusions>
        </dependency> 
         <!-- springbootjar包 -->
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 添加freemarker的依赖 -->
		<!-- <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency> -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

消费者:DemoController.java

package com.springboot.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;
import com.springboot.dao.Emp;
import com.springboot.service.DemoService;

@RestController  //RestController 相当于restbody+controller,所以默认返回的是json数据 
@RequestMapping("/user")
public class DemoController {
	
	@Autowired
	private DemoService demoService;
	
	 Map<String, String> map = new HashMap<>(); //返回的字符串接收不到 所以改成了map集合	 
	/**
	 * 根据id取emp对象
	 * @param id
	 * @return
	 */
	@RequestMapping("/getEmp.do")
	public Emp getEmp(int id){
		Emp emp = demoService.findEmp(id);
		return emp;
	}
	/**
	 * 查找全部对象
	 */
	@RequestMapping("/findEmps.do")
	public List<Emp> findEmpss(){
		List<Emp> emps = demoService.findEmps();
		System.out.println("全查");
		return emps;
	}
	/**
	 * 根据id 删除emp对象
	 */
	@RequestMapping("/delById.do")
	public String delEmpById(){
	 demoService.delEmp(3);
		return "success";
	}
	/**
	 * 根据id修改emp对象的值
	 */
	@RequestMapping("/modById.do")
	public String modById(Emp emp){
	/*	emp.setId(2);
		emp.setName("dfjjk");
		emp.setGender(3);
		emp.setDeptId(5);*/
		 demoService.modEmp(emp);
		 return "success";
	}
	/**
	 * 添加对象
	 */
	@RequestMapping("/addById.do")
	public  Map<String, String> addById(Emp emp){
	/*	emp.setName("大家风范");
		emp.setGender(2);
		emp.setDeptId(5);*/
		 demoService.addEmp(emp);
		map.put("fanhui", "success");
		 return map;
	}
	
}

为了解决跨域问题CorsConfig.java

package com.springboot.util;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class CorsConfigs extends WebMvcConfigurerAdapter{
	/**
	 * 解决前端站点(主要为JavaScript发起的Ajax请求)访问的跨域问题
	 */
	    @Override  
	    public void addCorsMappings(CorsRegistry registry) {  
	        
	        registry.addMapping("/**")  
	                .allowedOrigins("*")    //允许所有前端站点调用
	                .allowCredentials(true)  
	                .allowedMethods("GET", "POST", "DELETE", "PUT")  
	                .maxAge(1728000);  
	    }  
}

消费者:启动类App.java

package com.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;

@ImportResource("classpath:consume.xml")
@SpringBootApplication
public class App {
    public static void main( String[] args )
    {
    	SpringApplication.run(App.class, args);
        System.out.println( "消费者调用服务成功!" );
    }
}










Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐