- 1.Eureka(服务注册与发现)
- 1.1RestTemplate
它提供了多种访问远程 http 服务的方法, 是一种简单便捷的访问 restful 服务模板类, 是 spring 提供的用于访问 REST 服务的客户端模板工具集.
1.2RestTemplate 项目模块搭建
这里使用 maven 和 mybatis 进行模块的搭建, 步骤如下.
1.2.1 搭建父模块 cloud-eureka-demo
1) 创建一个 maven 工程名为 cloud-eureka-demo, 删除 src 目录
2) 在 pom 中导入依赖
- <!-- 统一管理 jar 包版本 -->
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <junit.version>4.12</junit.version>
- <lombok.version>1.16.18</lombok.version>
- <log4j.version>1.2.17</log4j.version>
- <MySQL.version>5.1.47</MySQL.version>
- <druid.version>1.1.16</druid.version>
- <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
- </properties>
- <!-- 依赖管理, 父工程锁定版本 -->
- <dependencyManagement>
- <dependencies>
- <!--spring boot 2.2.2-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>2.2.2.RELEASE</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <!--spring cloud Hoxton.SR1-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>Hoxton.SR1</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <!--spring cloud alibaba 2.1.0-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>2.1.0.RELEASE</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <!--mysql-->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>${MySQL.version}</version>
- </dependency>
- <!--druid-->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>${druid.version}</version>
- </dependency>
- <!--mybatis-->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>${mybatis.spring.boot.version}</version>
- </dependency>
- <!--junit-->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>${junit.version}</version>
- </dependency>
- <!--log4j-->
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>${log4j.version}</version>
- </dependency>
- <!--lombok-->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>${lombok.version}</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
- View Code
1.2.2 搭建公共服务模块 eureka-demo-API
公共服务模块用于存放公用的东西, 如实体类等.
1) 创建 maven 的工程名为 eureka-demo-API, 在 pom 中导入依赖
- <dependencies>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- </dependencies>
- View Code
2) 创建包 com.zys.cloud.entity, 在包下创建实体类 User, 内容如下
- package com.zys.cloud.entity;
- import lombok.*;
- @Getter
- @Setter
- @ToString
- public class User {
- private Long id;
- private String name;
- private String phone;
- }
- View Code
1.2.3 搭建服务提供者模块 eureka-demo-provider
1) 创建 maven 的工程名为 eureka-demo-provider, 在 pom 中导入依赖
- <dependencies>
- <!--web-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- 引入自己定义的模块 -->
- <dependency>
- <groupId>com.zys.springcloud</groupId>
- <artifactId>eureka-demo-API</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>1.1.10</version>
- </dependency>
- <!--mysql-connector-java-->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
- <!--eureka-client-->
- </dependencies>
- View Code
2) 创建包 com.zys.cloud, 在包下新建启动类 ProviderMain8001
- package com.zys.cloud;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class ProviderMain8001 {
- public static void main(String[] args) {
- SpringApplication.run(ProviderMain8001.class, args);
- }
- }
- View Code
3) 在 com.zys.cloud 包下在创建 controller 包, 存放 UserController
- package com.zys.cloud.controller;
- import com.zys.cloud.entity.User;
- import com.zys.cloud.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.Web.bind.annotation.*;
- import java.util.HashMap;
- import java.util.Map;
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- private UserService userService;
- @GetMapping("/get/{id}")
- public User getUser(@PathVariable("id")long id){
- return userService.getUser(id);
- }
- @PostMapping("/add")
- public Map<String,Object> addUser(User user){
- System.out.println(user);
- Map<String,Object> map=new HashMap<>();
- if(userService.addUser(user)!=0){
- map.put("msg","添加成功");
- map.put("code",200);
- }else{
- map.put("msg","添加失败");
- map.put("code",444);
- }
- return map;
- }
- }
- View Code
4) 在 com.zys.cloud 包下在创建 service 包, 存放 UserService
- package com.zys.cloud.service;
- import com.zys.cloud.entity.User;
- public interface UserService {
- public User getUser(long id);
- int addUser(User user);
- }
- View Code
5) 在 com.zys.cloud.service 包下在创建 impl 包, 存放 UserServiceImpl
- package com.zys.cloud.service.impl;
- import com.zys.cloud.dao.UserDao;
- import com.zys.cloud.entity.User;
- import com.zys.cloud.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- @Service
- public class UserServiceImpl implements UserService {
- @Autowired
- private UserDao userDao;
- @Override
- public User getUser(long id) {
- return userDao.getById(id);
- }
- @Override
- public int addUser(User user) {
- return userDao.create(user);
- }
- }
- View Code
6) 在 com.zys.cloud 包下在创建 dao 包, 存放 UserDao
- package com.zys.cloud.dao;
- import com.zys.cloud.entity.User;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
- @Mapper
- public interface UserDao {
- int create(User user);
- User getById(@Param("id") Long id);
- }
- View Code
7) 在资源目录下新建 mapper 文件夹, 然后再创建 UserMapper.xml
<?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.zys.cloud.dao.UserDao">
- <insert id="create" parameterType="User">
- insert into user values(null,#{name},#{phone})
- </insert>
- <resultMap id="BaseResultMap" type="com.zys.cloud.entity.User">
- <id column="id" property="id" jdbcType="BIGINT"/>
- <result column="name" property="name" jdbcType="VARCHAR"/>
- <result column="phone" property="phone" jdbcType="VARCHAR"/>
- </resultMap>
- <select id="getById" parameterType="Long" resultMap="BaseResultMap">
- select * from user where id=#{id};
- </select>
- </mapper>
- View Code
8) 在资源目录下创建配置文件 application.YAML
- server:
- port: 8001
- spring:
- application:
- name: cloud-eureka-demo-provider
- datasource:
- type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
- driver-class-name: org.gjt.mm.MySQL.Driver #MySQL 驱动包
- url: jdbc:MySQL://localhost:3306/db2020?useUnicode=true&characterEncoding-utr-8&useSSL=false
- username: root
- password: 123456
- mybatis:
- mapper-locations: classpath:mapper/*.xml
- #所有 Entity 别名类所在包
- type-aliases-package: com.zys.cloud.entity
- View Code
9) 创建 MySQL 的数据库和表
- create database db2021;
- create table user (
- id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
- name varchar(200) DEFAULT '',
- phone varchar(200) DEFAULT '',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- insert into user values(null,'李明','12345600');
- insert into user values(null,'赵慧','12345602');
- insert into user values(null,'李凯','12345601');
- View Code
10) 运行测试
启动主启动类, 使用 postman 工具输入 http://127.0.0.1:8001/user/get/2 使用 get 方式测试, 再输入 http://127.0.0.1:8001/user/add?name = 哈哈哈 & phone=123 使用 post 方式测试.
1.2.4 搭建服务消费者模块 eureka-demo-consumer
1) 创建 maven 的工程名为 eureka-demo-consumer, 在 pom 中导入依赖
- <dependencies>
- <!--web-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- 引入自己定义的模块 -->
- <dependency>
- <groupId>com.zys.springcloud</groupId>
- <artifactId>eureka-demo-API</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- View Code
2) 创建包 com.zys.cloud, 在包下新建启动类 ConsumerMain80
- package com.zys.cloud;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class ConsumerMain80 {
- public static void main(String[] args) {
- SpringApplication.run(ConsumerMain80.class, args);
- }
- }
- View Code
3) 在 com.zys.cloud 包下在创建 config 包, 存放配置类
- package com.zys.cloud.config;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.Web.client.RestTemplate;
- // 相当于 spring 中的 applicationContext.xml
- @Configuration
- public class ConfigBean {
- @Bean
- public RestTemplate getRestTemplate(){
- return new RestTemplate();
- }
- }
- View Code
4) 在 com.zys.cloud 包下在创建 controller 包, 存放 UserController
- package com.zys.cloud.controller;
- import com.zys.cloud.entity.User;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.Web.bind.annotation.*;
- import org.springframework.Web.client.RestTemplate;
- import java.util.Map;
- @RestController
- @RequestMapping("/consumer")
- public class UserController {
- private final String BASE_URL="http://127.0.0.1:8001";
- @Autowired
- private RestTemplate restTemplate;
- @GetMapping("/get/{id}")
- public User getUser(@PathVariable("id") long id){
- return restTemplate.getForObject(BASE_URL+"/user/get/"+id,User.class);
- }
- @PostMapping("/add")
- public Map<String,Object> addUser(User user){
- return restTemplate.postForObject(BASE_URL+"/user/add",user,Map.class);
- }
- }
- View Code
5) 在资源目录下创建配置文件 application.YAML
- server: port: 80
- View Code
6) 修改 eureka-demo-provider 的 UserController 类中 addUser 方法, 给 User 参数添加 @RequestBody 注解
7) 运行测试
启动主启动类, 使用 postman 工具输入 http://127.0.0.1/consumer/get/1 使用 get 方式测试, 再输入 http://127.0.0.1/consumer/add?name = 嘻嘻嘻 & phone=1255 使用 post 方式测试.
1.3Eureka
1.3.1 定义
它是一个基于 REST 的服务, 用于定位服务, 以实现云端中间层发现和故障转移. 简单来说就是服务注册与发现, 只要使用服务的标识就可以访问到服务, 类似于 Dubbo 的注册中心 Zookeeper.
它采用 cs 架构, Eureka Server 作为服务注册的服务器, 是注册中心; Eureka Client 是客户端, 需要注册的服务使用客户端连接到服务器并维持心跳. 可以通过服务器来监测各个微服务是否正常运行.
1.4Eureka 结合 RestTemplate 开发
有了 1.2 的例子, 这里就在这个基础上进行后续的操作.
1.4.1 搭建 eureka 的服务中心
所谓服务中心, 也就是 Eureka Server. 服务中心需要在启动类上添加注解 @EnableEurekaServer 表示这是一个 Eureka 的服务中心
1) 创建 maven 的工程名为 eureka-demo-server7001, 在 pom 中导入依赖
- <dependencies>
- <!--eureka server-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
- <!--boot web actuator-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- 引入自己定义的模块 -->
- <dependency>
- <groupId>com.zys.springcloud</groupId>
- <artifactId>eureka-demo-API</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- View Code
2) 创建包 com.zys.cloud, 在包下新建启动类 EurekaMain7001
- package com.zys.cloud;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
- @SpringBootApplication
- @EnableEurekaServer
- public class EurekaMain7001 {
- public static void main(String[] args) {
- SpringApplication.run(EurekaMain7001.class, args);
- }
- }
- View Code
3) 在资源目录下创建配置文件 application.YAML
- server:
- port: 7001
- eureka:
- instance:
- #eureka 服务端的实例名称
- hostname: localhost
- client:
- #false 表示不向注册中心注册自己
- register-with-eureka: false
- #false 表示自己端就是注册中心, 我的职责就是维护服务实例, 并不需要去检索服务
- fetch-registry: false
- service-url:
- #设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
- defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- View Code
4) 运行测试
启动主启动类, 在浏览器输入 http://127.0.0.1:7001/ 测试 server 是否搭建成功, 看到下图说明已搭建成功.
1.4.2 将服务提供者注册到 eureka
1) 在 eureka-demo-provider 的 pom 中添加 eureka 客户端的依赖
- <!--eureka-client-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- View Code
2) 在 eureka-demo-provider 的 YAML 文件中添加 eureka 客户端的配置
- # 把客户端注册到服务列表中
- eureka:
- client:
- #表示是否将自己注册进 EurekaServer 默认为 true
- register-with-eureka: true
- #是否从 EurekaServer 抓取已有的注册信息, 默认为 true. 单节点无所谓, 集群必须设置为 true 才能配合 ribbon 使用负载均衡
- fetch-registry: true
- service-url:
- defaultZone: http://localhost:7001/eureka
- View Code
3) 在 eureka-demo-provider 的启动类上添加 eureka 客户端的注解 @EnableEurekaClient
- @SpringBootApplication
- @EnableEurekaClient
- public class ProviderMain8001 {
- public static void main(String[] args) {
- SpringApplication.run(ProviderMain8001.class, args);
- }
- }
- View Code
4) 运行测试
来源: http://www.bubuko.com/infodetail-3492759.html