Eureka注册中心(注册中心服务端)

<properties>     
<!-- 项目设置:编码格式UTF-8 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
		<mysql-connector>5.1.39</mysql-connector>
		<druid>1.0.18</druid>
	</properties>
	<!-- springboot父依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.14.RELEASE</version>
    <relativePath/>
    <!-- lookup parent from repository -->
  </parent>
<dependencies>
   <!-- 启动依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!-- 热部署 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
  <!-- 测试依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Eureka 注册中心-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

  </dependencies>
    <!-- SpringCloud版本依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Greenwich.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

注册中心配置文件 application.yml

#注册中心配置
#
server: 
  port: 8000  #项目端口号
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实

启动类

@SpringBootApplication
@EnableEurekaServer
public class Config_App {
public static void main(String[] args) {
	SpringApplication.run(Config_App.class, args);
	
}
}

服务提供者(消费者) 两者一致

依赖

<properties>     
<!-- 项目设置:编码格式UTF-8 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
		<mysql-connector>5.1.39</mysql-connector>
		<druid>1.0.18</druid>
	</properties>
	<!-- springboot父依赖 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.14.RELEASE</version>
    <relativePath/>
    <!-- lookup parent from repository -->
  </parent>
<dependencies>
   <!-- 启动依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!-- 热部署 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
  <!-- 测试依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Eureka 注册中心-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  </dependencies>
 <!-- SpringCloud版本依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Greenwich.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

配置文件

##服务端  
eureka: 
  client: 
    serviceUrl: 
      #eureka 注册中心地址 
      defaultZone: http://localhost:8000/eureka
  instance:
    instance-id: spring-consumer8002   #ip名称
    prefer-ip-address: true   
server: 
  #项目端口号 
  port: 8001 
spring: 
  application: 
    #服务名称,随便写 
    name: spring-consumer

启动类

@SpringBootApplication
@EnableEurekaClient
public class Client_App {
public static void main(String[] args) {
	SpringApplication.run(Client_App.class, args);
	
}
}

服务端配置文件

##服务端  
eureka: 
  client: 
    serviceUrl: 
      #eureka 注册中心地址 
      defaultZone: http://localhost:8000/eureka
  instance:
    instance-id: spring-consumer8002   #ip名称
    prefer-ip-address: true   
server: 
  #项目端口号 
  port: 8001 
spring: 
  application: 
    #服务名称,随便写 
    name: spring-consumer

启动类

@SpringBootApplication
@EnableEurekaClient
public class Client_App {
public static void main(String[] args) {
	SpringApplication.run(Client_App.class, args);
	
}
}

restTemplate调用

再消费者中添加config类 也表示使用负载均衡ribbon

@Configuration
public class SpringConfig {

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

方法调用

@RestController
public class ConsumerController {
@Autowired
private RestTemplate rest;

@RequestMapping("/findAll")

public List<String> findAll(){
	return rest.getForObject("http://spring-provider-restTem/findAll",List.class);
}	
}

启动类不变

开启Hystrix容错保护 加入依赖

<!-- hystrix断路器 -->
		<dependency>
		<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
			<version>1.3.1.RELEASE</version>
		</dependency>

启动类加入

@EnableHystrix

Feign调用 (包含ribbon跟Hystrix) Feign默认的就有ribbon负载均衡 依赖

<!-- feign远程调用 -->
		<dependency>

			<groupId>org.springframework.cloud</groupId>

			<artifactId>spring-cloud-starter-openfeign</artifactId>

		</dependency>

配置

#开启feign调用 跟断路器
feign: 
  hystrix: 
    enabled: true

接口调用
Value表示你要调用项目的application.name名称
fallbackFactory表示断路器访问的类 ,@requestMapping()表示你要调用的方法赋值给findAll
也表示Hystrix容错保护

@FeignClient(value="spring-feign-provider",fallbackFactory= ConsumerFallBack.class)
public interface ConsumerService {
@RequestMapping("/getAll")
	public String  findAll();
}

启动类

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients

分布式配置中心 server 添加依赖

<!-- SpringCloud config-server 分布式配置中心 服务端 依赖 -->
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-config-server</artifactId>
   </dependency>

配置文件application.properties

#项目注册名称
spring.application.name=config-server
#项目发布版本号
server.port=9999
#远程 Git 项目仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/li_quan_you/springcloudconfigce.git
#Gitee : https://gitee.com/longtanmashuai/springcloud-config-server.git
#Github : https://github.com/CoddingMa/-springcloud-config-server.git
#远程 Git 私有项目的账号密码
spring.cloud.config.server.git.username=
#远程 Git 私有项目的密码
spring.cloud.config.server.git.password=
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

启动类

@EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
public class ConfigServer_App {
public static void main(String[] args) {
	
	SpringApplication.run(ConfigServer_App.class, args);
}
}

Client 添加依赖

<!-- SpringCloud config-server 分布式配置中心 消费端 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

配置文件

#项目名称
spring.application.name=config-client
#端口号
server.port=9001
#分支
spring.cloud.config.label=master
#多环境配置,默认 default(MS:Git 仓库配置文件中 profile 与此处对应) 
spring.cloud.config.profile=dev
# 注册中心配置路径
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 开启分布式配置
 spring.cloud.config.discovery.enabled=true
# 要获取的分布式配置名称
spring.cloud.config.discovery.serviceId=config-server

启动类

@SpringBootApplication
@EnableEurekaClient
public class Client_App {
public static void main(String[] args) {
	SpringApplication.run(Client_App.class, args);
	
}
}

Zuul路由网关 依赖

<!-- SpringCloud Zuul 网关路由 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

配置文件

eureka:
 client:
  serviceUrl:
  #eureka 注册中心地址
    defaultZone: http://localhost:8000/eureka/
 instance:
  instance-id: spring-zuul5555   #ip名称
  prefer-ip-address: true    
server:
 #项目端口号
 port: 5555
spring:
 application:
  #服务名称,随便写
  name: spring-zuul
zuul: 
  ignored-services: "*"  #拦截请求*包含所有
  routes:   #白名单
    student.serviceId: crm-consumer  #服务名称
    student.path: /student/**     #访问student会转发到crm-consumer中

启动类

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class Zuul_App {
public static void main(String[] args) {
	
	SpringApplication.run(Zuul_App.class, args);
	
}
}

继承zuulfilter

@Component
public class ZuulDemoFilter extends ZuulFilter{
private static Logger log = LoggerFactory.getLogger(ZuulDemoFilter.class);
public boolean shouldFilter() {
//判断该过滤器是否需要被执行。这里我们直接返回了 true,因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。
return true;
}
/**
* 过滤器的具体逻辑。
* 这里我们通过 ctx.setSendZuulResponse(false)令 zuul 过滤该请求,不对其进行路由,
* 然后通过 ctx.setResponseStatusCode(401)设置了其返回的错误码,
* 当然我们也可以进一步优化我们的返回,比如,通过 ctx.getResponse()对响应内容进
行编辑等。
*/
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(),request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
String refer=request.getHeader("refer");
if (accessToken != null) {
return null;//网关路由放行
}
log.warn("token is empty");
ctx.setSendZuulResponse(false);//网关路由过滤不路由
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (Exception e) {
}
return null;//网关路由放行
}

@Override
public String filterType() {
//过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为 pre,代表会在请求被路由之前执行。
return "pre";
}

@Override
public int filterOrder() {

//过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。
return 0;
}

}

全部依赖

<!-- springboot父依赖 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.14.RELEASE</version>
    <relativePath/>
    <!-- lookup parent from repository -->
  </parent>
  
    <!-- SpringCloud版本依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Greenwich.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
//子项目依赖


<dependencies>
   <!-- 启动依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

  <!-- 测试依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Eureka 注册中心-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  </dependencies>
  <!-- feign远程调用 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
  <!-- SpringCloud Zuul 网关路由 依赖 -->
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  </dependency>


  <!-- SpringCloud config-server 分布式配置中心 服务端 依赖 -->
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-config-server</artifactId>
   </dependency>
<!-- SpringCloud config-server 分布式配置中心 消费端 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- hystrix断路器 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
			<version>1.3.1.RELEASE</version>
		</dependency>

全部配置 注册中心配置

#注册中心配置
server: 
  port: 8000  #项目端口号
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

服务端配置

##服务端
eureka: 
  client: 
    serviceUrl: 
      #eureka 注册中心地址 
      defaultZone: http://localhost:8000/eureka
  instance:
    instance-id: spring-feign-provider8001   #ip名称
    prefer-ip-address: true   
server: 
  #项目端口号 
  port: 8001 
spring: 
  application: 
    #服务名称,随便写 
    name: spring-feign-provider
#开启feign调用 跟断路器
feign: 
  hystrix: 
    enabled: true

路由配置

eureka:
 client:
  serviceUrl:
  #eureka 注册中心地址
    defaultZone: http://localhost:8000/eureka/
 instance:
  instance-id: spring-zuul5555   #ip名称
  prefer-ip-address: true    
server:
 #项目端口号
 port: 5555
spring:
 application:
  #服务名称,随便写
  name: spring-zuul
zuul: 
  ignored-services: "*"  #拦截请求*包含所有
  routes:   #白名单
    student.serviceId: crm-consumer  #服务名称
    student.path: /student/**     #访问student会转发到crm-consumer中

启动类注解

@SpringBootApplication  //springboot自动装配启动依赖
@EnableZuulProxy         //开启路由网关
@EnableEurekaClient       //开启注册中心,把当前服务注册到注册中心 
@EnableFeignClients        //开启feign远程调用 包含ribbon负载均衡跟Hystrix容错保护 
@EnableEurekaServer        //注册中心  服务端,把当前服务为注册中心
@EnableHystrix             //开启容错保护,当用feign远程调用则不需要当前注解

整合Swagger 依赖

<!-- swagger api 
的依赖 --> 

<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger2</artifactId>
	<version>2.6.1</version>
</dependency>
	<dependency>
		<groupId>io.springfox</groupId>
		<artifactId>springfox-swagger-ui</artifactId>
		<version>2.6.1</version>
	</dependency>

配置

eureka:
 client:
   #eureka 注册中心地址
   serviceUrl: 
     defaultZone: http://localhost:8000/eureka/
 #eureka 注册中心展示的微服务信息页面,默认为 http://localhost:${server.port}/info
 instance:
  status-page-url: http://localhost:${server.port}/swagger-ui.html   #swagger启动页面访问路径
server:
#项目端口号
 port: 8010
spring:
 application:
  #服务名称,随便写
  name: service-swagger

注解

@EnableSwagger2    //开启swagger
@SpringBootApplication  //启动springboot自动配置
@EnableEurekaClient  //启动注册中心
@Api:修饰整个类,描述 Controller 的作用 
 @ApiOperation:描述一个类的一个方法,或者说一个接口 
@ApiParam:单个参数描述 
 @ApiModel:用对象来接收参数 
 @ApiProperty:用对象接收参数时,描述对象的一个字段 
 @ApiResponse:HTTP 响应其中 1 个描述 
 @ApiResponses:HTTP 响应整体描述 
 @ApiIgnore:使用该注解忽略这个 API 
 @ApiError :发生错误返回的信息 
 @ApiImplicitParam:一个请求参数 
 @ApiImplicitParams:多个请求参数

引入自己定义的通用项目

<dependency><!-- 引入自己定义的api通用包,可以使用clock部门Entity -->
			<groupId>com.ysd</groupId>
			<artifactId>crm-api-clock</artifactId>
			<version>${project.version}</version>
		</dependency>