java环境 服务注册发现Eureka组件

springcloud下单机版的Eureka使用

  • 服务注册中心
  • 服务提供者
  • 服务消费者

Eureka 服务注册发现中心配置

1、pom文件需要添加的依赖
    <dependencies>
        <!--spring cloud Eureka Server 启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
<!--spring-cloud依赖(注意和springboot版本的兼容)-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

注意spring-cloud-dependencies和springboot版本的兼容

2、application.properties下配置Eureka的配置属性
# 设置spring应用命名,可以自定义,非必要
spring.application.name=eureka-server
# 设置Eureka Server WEB控制台端口,自定义
server.port=8761
#是否将自己注册到Eureka-Server中,默认的为true(服务器自己就不注册自己了)
eureka.client.register-with-eureka=false
#是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=false
3、启动类配置,添加 @EnableEurekaServer 注解
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaServerApplication.class,args);
    }
}

访问地址 http://localhost:8761/ 出现如下图显示配置成功

4、注册中心的安全认证(如果可以任意访问的话,那么其安全性太低)

1、添加依赖

        <!--安全认证依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

引入依赖后后默认认证,再次访问 注册服务中心会要求登录

秘密是随机生成的UUID,启动时会显示在控制台。默认用户名是user

用户名和密码也可以在application.properties配置文件中配置

#安全验证
spring.security.user.name=liang
spring.security.user.password=123456

如果要禁用安全认证,可以在启动类中添加exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}

@EnableEurekaServer
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
public class Springcloud01EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springcloud01EurekaServerApplication.class, args);
    }

}

security安全认证存在跨站调用问题,不然服务提供者和消费者无法跨站调用。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

Eureka 服务提供者配置

1、pom文件需要添加的依赖
<dependencies>
        <!--Eureka 提供者要引入的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--webmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--集成 Swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--集成 Swagger UI-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

提供接口服务,所以顺便把swagger的依赖也引入了

2、在apiController包下添加了一个StudentController
@Api(tags = "学生管理相关接口")
@RequestMapping(value = "/student",method = {RequestMethod.GET})
@RestController
public class StudentController {

    @ApiOperation("根据id查询用户的接口")
    @RequestMapping("/get/{id}")
    public String getName(@PathVariable("id") Integer studentId){
        System.out.println("打印获取参数:"+studentId);
        return "打印获取参数:"+studentId;
    }
}
3、在config包下建一个swaggerConfig配置类

注意要添加上@EnableSwagger2注解,不让访问swagger页面会弹出一个alert错误

@Configuration
@EnableSwagger2 //启用 Swagger2
public class swaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.liang.springcloud02eurekaprovider.apiController"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("SpringBoot整合Swagger")
                        .description("SpringBoot整合Swagger,详细信息......")
                        .version("1.0")
                        .license("The Apache License")
                        .licenseUrl("http://www.baidu.com")
                        .build());
    }

}

4、配置Eureka 客户端注册 (确认以上的swagger和接口能正常访问)

启动类中添加@EnableEurekaClient 注解

@EnableEurekaClient
@SpringBootApplication
public class Springcloud02EurekaProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springcloud02EurekaProviderApplication.class, args);
    }
}
5、在application.properties(或yaml文件)中配置 Eureka的配置信息

提供者的应用名称必填,服务中心的应用名称可以不填

# 定义SpringBoot应用的名称,建议必须提供。在SpringCloud中,对服务的最大粒度的管理是使用应用命名的
# 最好是一个应用一个名称,在消费者角色开发的时候,比较容易查找Provider
spring.application.name=eureka-provider
server.port=8001
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#设置注册跳转地址
eureka.instance.status-page-url-path=/swagger-ui.html
6、服务提供者安全认证访问(如果注册中心中配置了认证访问)

defaultZone 格式http://用户名:密码@地址:端口/eureka/

#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
# 如果Eureka Server 中用了安全认证组件,需要使用安全认证语法。
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://liang:123456@localhost:8761/eureka/

Eureka 服务消费者配置

1、pom文件需要添加的依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
2、添加一个控制器调用执行消费
  • 两种执行方法
    一个是获取提供者实例结合(可能是一个)DiscoveryClient
    一个是选择提供者实例 LoadBalancerClient
@RestController
public class IndexController {

    @Autowired
    private RestTemplate restTemplate;
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplateBuilder().build();
    }

    @Autowired
    DiscoveryClient discoveryClient;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/consumer/{id}")
    private String getInfo(@PathVariable("id") int id){
        // 由于查询到的服务列表是一个集合 可能是集合化部署 集合中每一项就是一个实例
        List<ServiceInstance> provider = discoveryClient.getInstances("eureka-provider-01");
        for(ServiceInstance serviceInstance : provider){
            String host= serviceInstance.getHost();
            Integer port= serviceInstance.getPort();
            StringBuilder sb=new StringBuilder();
            sb.append("http://");
            sb.append(host);
            sb.append(port);
            sb.append("/student/get");
            sb.append("/"+id);

            System.out.println("格式拼接:"+sb.toString());
            System.out.println(serviceInstance.toString());

            String geturlInfo=restTemplate.getForObject(sb.toString(),String.class);
            System.out.println("获取提供内容:"+geturlInfo);
        }
        return "执行ID:"+id;
    }

    @GetMapping("/consumer2/{id}")
    private String getInfo2(@PathVariable("id") int id){
        ServiceInstance serviceInstance= loadBalancerClient.choose("eureka-provider-01");
        String host= serviceInstance.getHost();
        Integer port= serviceInstance.getPort();
        StringBuilder sb=new StringBuilder();
        sb.append("http://");
        sb.append(host);
        sb.append(port);
        sb.append("/student/get");
        sb.append("/"+id);

        System.out.println("格式拼接:"+sb.toString());
        System.out.println(serviceInstance.toString());

        String geturlInfo=restTemplate.getForObject(sb.toString(),String.class);
        System.out.println("获取提供内容:"+geturlInfo);

        return "执行ID:"+id;
    }

}
3、application.properties中配置Eureka信息

消费者可以不注册到服务中心

spring.application.name=eureka-consumer
server.port=8080
# 消费者可以不注册到服务中心
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
4、启动类添加@EnableDiscoveryClient 注解
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloud03EurekaConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springcloud03EurekaConsumerApplication.class, args);
    }

}
5、消费者安全认证访问(如果注册中心中配置了认证访问)

defaultZone 格式http://用户名:密码@地址:端口/eureka/

#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://liang:123456@localhost:8761/eureka/

依次启动 注册中心、服务提供者、服务消费者。执行消费者中的方法。
posted @ 2020-12-04 19:05  人间有妖气  阅读(250)  评论(0编辑  收藏  举报