赞
踩
在父pom的 标签里添加如下依赖:注意cloud的版本号和springboot版本号是有对应关系的如下所示
划红线的就是本次cloud版本和boot版本的对应关系,最新版本对应关系请参考官网:Spring Cloud
springcloud依赖
<!--cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
新建Model
设置artifacid
设置保存位置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
bootstrap.yml
spring:
application:
name: eureka-server#应用名称(集群下相同)
server:
port: 7001
# eureka配置
eureka:
instance:
hostname: localhost
prefer-ip-address: true # 开启ip地址注册
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:7001/eureka/
EurekaServer7001
package com.kuang.eurea;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @Description 注册中心启动类
* @ClassName EurekaServer7001
* @Author 康世行
* @Date 16:02 2022/7/17
* @Version 1.0
**/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7001.class,args);
}
}
注解解释
@SpringBootApplication springboot //启动注解
@EnableEurekaServer //开启注册服务注解
地址:Eureka
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
yml
application.yml添加如下配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
成功注册到Eureka
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
yml
application.yml添加如下配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
成功注册到Eureka
集群和单体的操作步骤一致,就是按照单体的步骤在新建两个模块7002,7003,一共三个模块7001,7002,7003。只是7001,7002,7003的配置文件需要从新修改
7001yml
# eureka配置
eureka:
instance:
hostname: localhost
prefer-ip-address: true # 开启ip地址注册
client:
register-with-eureka: true # 是否向尤里卡注册自己
fetch-registry: false
service-url:
defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
7002yml
# eureka配置
eureka:
instance:
hostname: localhost
prefer-ip-address: true # 开启ip地址注册
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7003/eureka/
7003yml
# eureka配置
eureka:
instance:
hostname: localhost
prefer-ip-address: true # 开启ip地址注册
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
启动效果
7001
7002
7003
三个注册中心全部启动
服务注册效果
7001
7002
从上面两张注册后的截图中可以看到-客户端只是向7001 注册了,但是客户端的实例会出现在7002上和7003上。7003 上是否有客户端的实例,大家可以自己验证下。图我这就不贴出来了!
既然已经把注册中心搭建好了,并且生产者和消费者都已经成功注册上去了。下一步就是把之前使用ip地址调用生产者的地方改成使用服务名称调用。
controller
/**
* @Description TODO
* @ClassName DeptConsumer
* @Author 康世行
* @Date 17:10 2022/5/22
* @Version 1.0
**/
@RestController
@RequestMapping("/deptConsumer")
@Api( "部门管理-消费者")
public class DeptConsumer {
@Autowired
private RestTemplate restTemplate;
//通过 服务名获取对应地址
private static final String REST_URL_PREFIX="http://DEPT-PROVIDER";
@GetMapping("/addDeptConsumer/{deptName}")
@ApiOperation("添加部门")
public FrontResult addDeptConsumer( @PathVariable("deptName") String deptName){
FrontResult forObject = restTemplate.getForObject(REST_URL_PREFIX+"/dept/addDept/" + deptName, FrontResult.class);
return forObject;
}
@GetMapping("/queryDeptConsumer/{deptno}")
@ApiOperation("查询部门")
public FrontResult queryDeptConsumer( @PathVariable("deptno") String deptno){
FrontResult forObject = restTemplate.getForObject(REST_URL_PREFIX+"/dept/queryDept/" + deptno, FrontResult.class);
return forObject;
}
}
restTemplate
//在启动项里注入-在原本的基础上添加 @LoadBalanced 负载均衡注解,用于根据服务名动态获取实例ip地址和接口。
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
启动项添加如下注解(本人亲测这个注解加不加都行,没有影响!)
@EnableEurekaClient
接口测试
地址
http://localhost:9001/swagger-ui.html
结果
查询部门
http://localhost:9001/deptConsumer/queryDeptConsumer/3
添加部门
路由在微服务体系结构的一个组成部分。
例如,/
可以映射到您的Web应用程序,/api/users
映射到用户服务,/api/shop
映射到商店服务。
Zuul是Netflix基于JVM的路由器和服务器端负载均衡器。
新建Zuul模块
指定保存位置
pom
<dependencies>
<!--zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-devtools</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 9527
spring:
application:
name: zuul
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
zuul:
routes:
mydeptProvider.serviceId: dept-provider
mydeptProvider.path: /mydeptProvider/**
mydeptconsumer.serviceId: deptconSumer
mydeptconsumer.path: /mydeptConsumer/**
ignored-services: "*" # 忽略,隐藏全部默认服务名称
启动类
/**
* @Description 网关启动类
* @ClassName ApplicationZuul
* @Author 康世行
* @Date 20:52 2022/7/17
* @Version 1.0
**/
@SpringBootApplication
@EnableZuulProxy
@EnableSwagger2Doc
public class ApplicationZuul {
public static void main(String[] args) {
SpringApplication.run(ApplicationZuul.class,args);
}
//具体生产者服务和消费者服务的swagger地址
@Component
@Primary
class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
//服务名 服务名 “v2/api-docs这部分是固定的”
resources.add(swaggerResource("mydeptProvider", "/mydeptProvider/v2/api-docs", "2.0"));
resources.add(swaggerResource("mydeptConsumer", "/mydeptConsumer/v2/api-docs", "2.0"));
return resources;
}
//定义swaggerResource的构造函数
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
}
测试-浏览器访问
swagger接口地址
服务跨域问题解决方案-生产者和消费者跨域配置类(每个服务都需要配置此类)
package com.kuang.zuul.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* @Description 全局跨域配置
* @ClassName GlobalCorsConfiguration
* @Author 康世行
* @Date 8:37 2022/7/18
* @Version 1.0
**/
@Configuration
public class GlobalCorsConfiguration {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
// corsConfiguration.addExposedHeader("head1");
//corsConfiguration.addExposedHeader("Location");
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
访问消费者-查询部门
访问消费者-添加部门
访问生产者-查询部门
访问生产者-添加部门
关于zuul(网关)暂时先分享-动态路由的-路径转发,稍后更新网关的其他具体使用敬请期待!
zuul聚合swagger-统一服务的swagger
消费者接口
生产者接口
划红线的模块是本次集成完zuul和Eureka的模块,下面那个是基础模块!
《下一篇》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。